2010-12-01 20 views
0

Je rencontre des problèmes pour accéder aux membres de la classe dérivée à l'aide de l'objet de classe de base.Accès aux membres de la propriété de classe dérivée à partir de l'objet de classe de base dans CSharp

Scénario:

public class BaseClass{ 
    public virtual Write(BaseClass data){ 
    } 
} 

public class DerivedClass : BaseClass{ 

    private string name: 

    public string Name {get {return name} set {name = value;} } 

    public override Write(BaseClass data){ 
    Console.println(data.Name); // gives me error here 
    } 

} 
+2

Nom est jamais défini dans BaseClass. –

+0

Vous ne pouvez pas faire cela, vous ne pouvez pas vous attendre à ce que 'BaseClass data' soit du même type que 'DerivedClass'. Qu'attendez-vous qu'il imprime? –

+1

En outre, 'Console.println' n'existe pas. 'Console.WriteLine' faire. –

Répondre

6

La raison pour laquelle vous avez un accès aux propriétés problème dans les classes dérivées est que la classe de base ne fonctionne pas (et surtout ne doit pas) rien savoir à leur sujet. Différentes classes dérivées peuvent avoir un ensemble différent de propriétés ajoutées. Rendre la classe de base consciente de cela contrecarrerait les principes importants de la conception orientée objet. Un de ces principes qui me vient à l'esprit est le Liskov Substitution Principle.

0

Comme indiqué, le nom n'existe pas dans la BaseClass.

Déplacez "nom" vers la classe de base ou créez une méthode d'écriture distincte qui écrit les données spécifiques de la classe héritée.

public class DerivedClass : BaseClass{ 

    public string Name { get; set; } 

    public override void Write(DerivedClass data) { 
     Console.printLn(data.Name); 
     base.Write(data) 
    } 

    // why print a different instance, just write self 
    public void Write() { 
     Console.printLn(this.Name); 
     base.Write(this) 
    } 

} 

Je ne sais pas pourquoi la classe accepterait une autre instance de classe à écrire quand vous pouvez invoquer écrire sur elle-même. Changer le BaseClass signture à

public virtual Write() 

ou WebControls comme

public virtual Write(HtmlTextWriter writer); 

si vous voulez simplement le débogage, vous pouvez simplement sérialisation JSON ou XML puis sortie qui à votre console