11
votes

C # Classes d'amis et composition de oop

Compte tenu de la classe A, qui contient des ensembles de données brutes, et la classe B, qui contient une version réorganisée (PRÊT GUI) de ces données, je voudrais apporter les données brutes dans une visible en b.

Il est clair que les données brutes de la classe A sont contenues dans les membres privés. J'aimerais rendre ces données visibles dans B si l'utilisation de quelque chose ressemble à la méthode C ++ AMI CLISES.

Comment puis-je m'approcher cela?

merci.


0 commentaires

5 Réponses :


9
votes

Strictement parler, vous ne pouvez pas définir une classe spécifique (ou une liste de classes) que vous pouvez exposer les données à. Vous pouvez toutefois utiliser le modificateur d'accès interne au lieu de privé , ce qui rend les membres à la disposition de n'importe quelle classe du même assemblage.

Cela étant dit, vous devriez fortement envisager d'exposer ces membres par le biais de propriétés plutôt que des champs (ce que je devine que vous prévoyez de l'exposition). Faire cela permettra à la classe de définir exactement comment ces informations peuvent être exposées à d'autres classes et quoi - si quelque chose - devrait arriver quand une autre classe modifie les données.


4 commentaires

interne + propriétés = coffre-fort.


Cela semble être un cas pour les propriétés internes ou éventuellement une interface interne que la classe de données source a des outils qui permet à B d'accéder à certains des membres privés sans être trop attaché à UNE.


@Lbushkin: une interface interne est certainement une solution, mais elle semble inutile à moins qu'il y ait réellement être plus d'une classe la mise en œuvre.


C'est pourquoi j'ai dit ou éventuellement dans mon commentaire - puisqu'il peut être surchargé. Toutefois, les classes de modèle d'UI-Adaptive sont parfois créées pour chaque point de vue de l'UI nécessaire, comme dans le modèle MVVM utilisé pour les applications Silverlight / WPF. Dans ces cas, des interfaces internes peuvent rendre les choses un peu plus lâchées et plus faciles à changer.



1
votes

Vous pouvez définir à la fois dans un assemblage et marquer les champs dans un "interne".

Une approche plus OO consiste à fournir un ensemble de méthodes publiques dans A permettant l'accès aux données (ou un sous-ensemble des données), généralement via des propriétés simples.


0 commentaires

0
votes

Selon votre structure, vous pourrez peut-être utiliser des classes partielles. Cela signifierait que les données et l'interface utilisateur sont en fait à la fois dans la même classe, mais vous les avez dans différents fichiers.

Si cela ne fonctionne pas pour vous, vous avez des variables intérieures à la surface intérieure comme alternative ou travaillant avec des jeux de données que l'interface utilisateur représente de manière plus générique.


0 commentaires

0
votes

L'ancienne méthode (jeu de mots) serait de définir de simples getvalue () em> et setValue () em> fonctions pour renvoyer cette valeur afin que ces valeurs deviennent inaccessibles sans la Utilisation de ces fonctions, en C # Ces fonctions sont des membres prédéfinis appelés propriétés.

class TestMethod{ 
private int Secret;

get { return Secret;}
set { Secret = value;}
}


0 commentaires

6
votes

Peut-être peut-être que cela pourrait vous aider ..

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));
    }
}


2 commentaires

Ceci est un moyen intelligent de mettre en œuvre la sémantique de ami . Je n'utilise pas toujours ami , mais quand je le fais, j'utilise ce modèle d'accesseur :-)


Mais cela ne fait que casser la sécurité du temps. J'utilise à peu près n'importe quelle classe à AccessData Ici et le compilateur ne se plaingait pas.