2016-07-05 9 views
0

Ich habe zwei Klassen in C#:C# Generische Klasse, wie kann ich öffentliche Eigenschaften der abgeleiteten Klasse von Typ Parameter verwenden?

public abstract class BaseAccount 
{ 
    public void MyMethod1() 
    { 
     //Code 
    } 
} 

public class DerivedAccount : BaseAccount 
{ 
    public void MyMethod2() 
    { 
     //code 
    } 
} 

public class AccountBL<T> where T : BaseAccount, new() 
{ 
    public void TestMethod() 
    { 
     T obj1 = new T(); 
     obj1.MyMethod1(); 
     obj1.MyMethod2(); //Wrong!!! Can I use a method in derived class without changing constaint?? 
    }  
}  

Wie kann ich öffentliche Eigenschaften einer abgeleiteten Klasse in der generischen Klasse?

Ich möchte nicht mehrere generische Klasse für jede meiner abgeleiteten Klasse implementieren.

Antwort

0

Es ist, weil Sie Ihre Struktur. Mit T : BaseAccount, new() sagen Sie, dass T von BaseAccount erben muss, damit Sie die Methoden von BaseAccount verwenden können. Wenn Sie die Methoden von DerivedAccount verwenden möchten, müssen Sie dies zuerst prüfen.

3

Definieren Sie eine Schnittstelle, die die Mitglieder enthält, auf die Sie zugreifen möchten, und beschränken Sie dann den Typparameter auf Typen, die diese Schnittstelle implementieren.

public IMyInterface { 
    void MyMethod2(); 
} 

public class AccountBL<T> where T : BaseAccounbt, new(), IMyInterface { 
    // Members can access T.MyMethod2() 
} 

Im Gegensatz zu anderen einigen Sprachen C# erlaubt nur auf Mitglieder Bezug genommen auf Typ Parameter, die die Anforderungen an die Typparameter auferlegt passen.

+0

kann es gut sein, aber ist ein wenig schwer zu verstehen. und ich bin mir nicht sicher, kann groß sein oder nicht? brauchen mehr denken ... danke –

+0

@nimakhankhanizadeh Was meinst du mit "großen Maßstab"? – Richard

2

Wenn Sie DerivedAccount.Method2() verwenden möchten, ist dieser Wunsch bereits eine Einschränkung. Sie müssen natürlich T DerivedAccount sein.

Sie könnte so etwas tun:

(obj1 as DerivedAccount)?.MyMethod2(); 

aber Ich mag persönlich nicht Typ wirft und Generika mischen. Wenn Ihre Methode generisch ist, bedeutet dies, dass Sie sich nicht für den spezifischen Laufzeittyp interessieren (außer dass es BaseAccount sein sollte). Dann scheint das Hinzufügen von Typ-Checks etwas merkwürdig.

+0

danke, das ist einfach und gute Antwort. –

1

Es ist wegen Ihrer Struktur. Mit where T : BaseAccount, new() sagen Sie, dass T von BaseAccount erben muss, damit Sie die Methoden von BaseAccount verwenden können. Wenn Sie die Methoden von DerivedAccount verwenden möchten, müssen Sie prüfen, diese zuerst:

if (obj1 is DerivedAccount) {} 

Und als Guss als DerivedAccount. so erhalten Sie die folgenden Schritte aus:

public class AccountBL<T> where T : BaseAccount, new() 
{ 
    public void TestMethod() 
    { 
     T obj1 = new T(); 
     obj1.MyMethod1(); 

     if (obj1 is DerivedAccount) 
     { 
      (obj1 as DerivedAccount).MyMethod2(); 
     } 
    }  
} 

Hier haben Sie ein ausführbares Beispiel: https://dotnetfiddle.net/NwxPRt

+1

danke, das ist einfach und gute Antwort. wie @Rene Vogt –

Verwandte Themen