2016-04-13 7 views
1

Gibt es eine Möglichkeit, dass das funktioniert?Aufrufmethode in generischem Objekt

class A 
{ 
    public virtual string Greet() { return "Hello"; } 
} 
class B : A 
{ 
    public override string Greet() { return "Hola"; } 
} 
class C : A 
{ 
    public override string Greet() { return "Привет"; } 
} 
class Greeting<T> 
{ 
    List<T> list; 
    public Greeting(List<T> list) 
    { 
     this.list = new List<T>(); 
     this.list.AddRange(list); 
    } 
    public void Show() 
    { 
     foreach (T el in list) 
      el.Greet(); // 'T' does not contain a definition for 'Greet' 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<A> list = new List<A>() { new A(), new B(), new C() }; 
     Greeting<A> g = new Greeting<A>(list); 
     g.Show(); 
    } 
} 

Ich weiß, dass in diesem Fall soll ich List<Shop> list (in Gruß-Klasse) schreiben und nicht generische Klasse verwenden ... aber ich brauche diese Implementierung

Antwort

6

Sie arbeiten müssen ein constraint auf hinzufügen T, ohne sie, hat der Compiler keine Möglichkeit, nur zu wissen, werden die Objekte übergeben, die von A ableiten und die Methode ist nicht verfügbar:

class Greeting<T> where T : A 
{ 
    List<T> list; 
    public Greeting(List<T> list) 
    { 
     this.list = new List<T>(); 
     this.list.AddRange(list); 
    } 
    public void Show() 
    { 
     foreach (T el in list) 
     el.Greet(); // 'T' does not contain a definition for 'Greet' 
    } 
}