2009-03-24 9 views
9

ich die folgende Struktur haben:Angabe der Rückgabetyp einer abstrakten Methode von einer Basisklasse nach einer Unterklasse

abstract class Base { 
     public abstract List<...> Get(); //What should be the generic type? 
} 

class SubOne : Base { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base { 
    public override List<SubTwo> Get() { 

    } 
} 

Ich möchte eine abstrakte Methode zu schaffen, die unabhängig von Klasse gibt die konkrete Unterklasse ist. Wie Sie in diesem Beispiel sehen können, sollte die Methode in SubOneList<SubOne> zurückgeben, während die Methode in SubTwoList<SubTwo> zurückgeben sollte.

Welchen Typ muss ich in der Signatur angeben, die in der Base-Klasse deklariert ist?


[UPDATE]

Vielen Dank für die entsandten Antworten.

Die Lösung ist die abstrakte Klasse generisch, wie solche zu machen:

abstract class Base<T> { 
     public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 

    } 
} 
+1

In Ihrem Update/Antwort, wie würden Sie eine Liste oder Sammlung der "Base" Klasse erstellen, die sowohl SubOne enthalten und SubZwei Objekte? –

Antwort

18

Ihre abstrakte Klasse sollte generisch sein.

abstract class Base<T> { 
     public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 
    } 
} 

Wenn Sie auf die abstrakte Klasse ohne gattungs Argument verweisen, verwenden Sie eine Schnittstelle:

interface IBase { 
     //common functions 
} 

abstract class Base<T> : IBase { 
     public abstract List<T> Get(); 
} 
+0

Ausgezeichnet, genau was ich gesucht habe. Vielen Dank –

+0

Dang, ich muss * lernen * schneller tippen. –

1

ich dir es die spezifische Unterklasse sein, nicht bekommen, denken kann. Sie können dies aber tun:

abstract class Base<SubClass> { 
     public abstract List<SubClass> Get(); 
} 
class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 
     throw new NotImplementedException(); 
    } 
} 
class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 
     throw new NotImplementedException(); 
    } 
} 
1

Try this:

public abstract class Base<T> { 
    public abstract List<T> Foo(); 
} 

public class Derived : Base<Derived> { // Any derived class will now return a List of 
    public List<Derived> Foo() { ... }  // itself. 
} 
3
public abstract class Base<T> 
{  
    public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> 
{ 
    public override List<SubOne> Get() { return new List<SubOne>(); } 
} 

class SubTwo : Base<SubTwo> 
{ 
    public override List<SubTwo> Get() { return new List<SubTwo>(); } 
}