2010-01-29 6 views
1

Comment puis-je masquer la propriété de classe parent dans la classe enfant.comment masquer la propriété parent de la classe enfant

Lorsque la classe parente a une propriété appelée "Parent", où je ne veux pas l'utiliser dans la classe enfant. Comment puis-je supprimer ou masquer cela.

+1

Vous demandez trois langues complètement différentes - dont l'un est vous utilisez réellement? –

+0

Juste eu un second regard sur les balises (j'ai supposé au début que vous vouliez dire des membres), mais C++ (et je suppose Java) n'ont pas de propriétés. – Yacoby

+0

@Yacoby: Oui, Java non plus. – jason

Répondre

11

Ainsi, il semble que vous demandiez ce qui suit. Vous avez

class Parent { 
    public SomeType ParentProperty { get; set; } 
} 

class Child : Parent { } 

et que vous voulez cacher SomeProperty d'être visible dans les cas de Child.

Ne faites pas ça! Ne pas masquer les propriétés de la classe de base qui sont visibles. Tout d'abord, il est facile de se déplacer:

Parent p = new Child(); 
p.ParentProperty; // oops! 

En second lieu, il est une violation énorme de la Liskov substitution principle. Fondamentalement, le principe dit que tout ce que vous savez être vrai sur toutes les instances de Parent devrait également être vrai sur toutes les instances de Child. Ici, nous savons que toutes les instances de Parent ont une propriété visible appelée ParentProperty de type SomeType. Par conséquent, la même chose devrait (morale devrait) être vrai de toutes les instances de Child.

Pouvez-vous nous dire pourquoi vous voulez faire cela et peut-être que nous pouvons vous suggérer une alternative?

+0

Notez que le boyau différent est recommandé pour les membres privés. – Dykam

+0

mais il était en classe publique mère – Santhosh

+0

@santose: Pouvez-vous préciser si vous parlez des classes imbriquées ou classes dérivées? – jason

0

Si vous avez dérivé une classe lorsque vous dites une classe enfant, il n'y a heureusement aucun moyen de la faire passer. Pour que ce serait mauvais conte un coup d'oeil à ce code:

base myObj = objectFactory.Create(); myObj.theMethodHiddenAway();

l'usine Peut retourner n'importe quel objet de type base incluant toutes les classes dérivées de base. Le compilateur doit décider quelle version de theMethodHiddenAway appeler la compilation (overload resulution) et comme le type concret ne compile pas le temps, s'il était possible de faire disparaître une méthode par héritage, le compilateur ne sait pas si theMethodHiddenAway existé.

Je vous suggère de regarder votre design puisque ce que vous demandez sent l'un des deux défauts de conception. Soit la méthode n'appartient pas à la première place, soit la classe dérivée ne doit pas hériter de la classe de base.

0

Vous ne pouvez pas. Une référence de classe enfant sera toujours implicitement convertible en une référence de classe parente. Vous ne pouvez donc pas empêcher l'utilisation de la propriété sans la retirer de la classe parente.

2

Ne le faites pas.

Vous avez un problème de conception si vous en avez besoin. Le Liskov Substitution Principle vous indique que votre classe Child doit être substituable à une classe Parent. Cela signifie que tout code qui utilise une classe Parent devrait être en mesure d'utiliser votre classe Child à la place. Ce n'est pas le cas si vous voulez supprimer une propriété. Vous ne pouvez pas remplacer un parent par un enfant, quelle que soit l'utilisation de cette propriété.

2

Je suppose que la question/réponse évidente est, peut-être vous devriez juste rendre la propriété privée. (à moins bien sûr que vous n'avez pas accès à la source pour commencer)

1

Espoir cette aide, vous pouvez ombre à la propriété et le mettre en lecture seule :)

Questions connexes