2010-11-16 4 views
4

Je suis assez nouveau à l'héritage et je voulais poser une question. J'ai une classe de base qui a beaucoup de fonctionnalités qui sont partagées par un certain nombre de classes dérivées.C# héritage aide

La seule différence pour chaque classe dérivée est une méthode unique appelée Nom. La fonctionnalité est la même pour chaque classe dérivée, mais la distinction Name est nécessaire.

J'ai une propriété dans la classe de base appelée Name. Comment puis-je l'organiser de sorte que les classes dérivées puissent chacune remplacer la propriété de la classe de base?

Merci.

+1

Je pense avoir une méthode et une propriété avec des noms identiques est d'avoir des ennuis. Class.Name compilerait bien même si Class.Name() était prévu. S'il y a une raison impérieuse pour cette conception, faites attention. – Sorax

Répondre

4

Déclarez votre méthode comme virtual

public class A 
{ 
    public virtual string Name(string name) 
    { 
     return name; 
    } 
} 
public class B : A 
{ 
    public override string Name(string name) 
    { 
     return base.Name(name); // calling A's method 
    } 
} 
public class C : A 
{ 
    public override string Name(string name) 
    { 
     return "1+1"; 
    } 
} 
2

vous devez déclarer votre propriété (dans la clase de base) comme virtual

3

Utilisez un virtual bien:

class Base 
{ 
    public virtual string Foo 
    { 
     get; 
     set; 
    } 
} 

class Derived : Base 
{ 
    public override string Foo 
    { 
     get { 
      // Return something else... 
     } 
     set { 
      // Do something else... 
     } 
    } 
} 
+0

Parfait .... merci. J'essayais des choses comme ça, mais je n'arrivais pas à faire les choses correctement. –

2

Pour permettre à chaque classe dérivée de passer outre la propriété que vous avez juste besoin de marquer la propriété comme virtuel

class Base { 
    public virtual Property1 { 
    get { ... } 
    set { ... } 
    } 
} 
3

Vous pouvez déclarer avec un mot-clé virtuelle ou abstraite dans la classe de base, la classe dérivée peut sur-ride il

2

Eh bien, je ne suis pas sûr de votre description que l'héritage est en fait la bonne solution au problème, mais voici comment vous rendre possible une propriété à redéfinie:

class Base 
{ 
    public virtual string Name { get; set; } 
} 

Mais faire vous en avez besoin pour être accessible en écriture? Une propriété readonly peut être plus judicieux dans ce cas, cela pourrait fonctionner:

class Base 
{ 
    public virtual string Name 
    { 
     get { return "BaseName"; } 
    } 
} 

class Derived : Base 
{ 
    public override string Name 
    { 
     get { return "Derived"; } 
    } 
} 
2

Dans la classe de base:

public virtual string Name { get; set; } 

Dans les classes dérivées:

public override string Name { get; set; } 

Cependant, si la seule différence entre les classes est qu'ils ont des noms différents, je dirais qu'au lieu de l'héritage, vous devriez simplement utiliser la classe de base avec le jeu de noms dans le constructeur:

par exemple.

public class MyObject 
{ 
    public string Name { get; private set; } 

    public enum ObjectType { TypeA, TypeB, ... } 

    public MyObject(ObjectType obType) 
    { 
      switch (obType) 
      { 
       case ObjectType.TypeA: 
        Name = "Type A"; 
       // and so on 
      } 
    } 
}