Classes amigas C# e composição OOP
-
24-09-2019 - |
Pergunta
Dada a classe A, que contém conjuntos de dados brutos, e a classe B, que contém uma versão reorganizada (pronta para GUI) desses dados, gostaria de tornar os dados brutos em A visíveis em B.
É evidente que os dados brutos da classe A estão contidos em membros privados.Eu gostaria de tornar esses dados visíveis em B através do uso de algo semelhante ao método de classes amigas C++.
Como posso abordar isso?
Obrigado.
Solução
Estritamente falando, você não pode definir uma classe (ou lista de classes) específica para a qual possa expor os dados. Você pode, no entanto, usar o internal
Modificador de acesso em vez de private
, que disponibiliza os membros a qualquer classe na mesma montagem.
Dito isto, você deveria fortemente Considere expor esses membros por meio de propriedades, em vez de campos (que é o que acho que você está planejando expor). Fazer isso permitirá que a classe defina exatamente como essas informações podem ser expostas a outras classes e o quê-se qualquer coisa-deverá acontecer quando outra classe altera os dados.
Outras dicas
Pode ser isso pode ajudá -lo ..
public class A
{
public A() { }
public string AccessData(object accessor)
{
if (accessor is B)
return "private_data";
else
throw new UnauthorizedAccessException();
}
}
public class B
{
public B() { }
private void AccessDataFromA()
{
Console.WriteLine(new A().AccessData(this));
}
}
Você pode definir ambos em uma montagem e marcar os campos em um "interno".
Uma abordagem mais OO é fornecer um conjunto de métodos públicos em A que permitem acesso aos dados (ou um subconjunto dos dados), normalmente por meio de propriedades simples.
Dependendo da sua estrutura, você poderá usar classes Partial.Isso significaria que os dados e a interface do usuário estão, na verdade, na mesma classe, mas você os possui em arquivos diferentes.
Se isso não funcionar para você, então você tem variáveis de escopo interno como alternativa ou trabalha com conjuntos de dados que a IU representa de maneira mais genérica.
O método antigo (trocadilho pretendido) seria definir simples Obter valor() e setValue () Funções para retornar esse valor para que esses valores se tornassem inacessíveis sem o uso dessas funções, em C# essas funções são membros predefinidos chamados propriedades.
class TestMethod{
private int Secret;
get { return Secret;}
set { Secret = value;}
}
O outro método é, como outros declararam diante de mim, basta usar o internal
modificador.