2009-03-24 6 views
9

Ho la seguente struttura:Specificando il tipo di ritorno di un metodo astratto da una classe base in base a una classe secondaria

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() { 

    } 
} 

Voglio creare un metodo astratto che restituisce qualsiasi classe la classe sub calcestruzzo è. Quindi, come puoi vedere dall'esempio, il metodo in SubOne deve restituire List<SubOne> mentre il metodo in SubTwo deve restituire List<SubTwo>.

Che tipo devo specificare nella firma dichiarata nella classe Base?


[UPDATE]

Grazie per le risposte distaccati.

La soluzione è quello di rendere la classe astratta generica, come ad esempio:

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

nell'aggiornamento/risposta, come è possibile creare un elenco o una raccolta di "base" classe che può contenere sia SubOne e SubTwo oggetti? –

risposta

18

La classe astratta dovrebbe essere generico.

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() { 
    } 
} 

Se è necessario fare riferimento alla classe astratta senza l'argomento di tipo generico, utilizzare un'interfaccia:

interface IBase { 
     //common functions 
} 

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

Eccellente, esattamente quello che stavo cercando. Grazie –

+0

Dang, ho * ottenuto * di imparare a digitare più velocemente. –

1

Non credo che si può ottenere sia la sottoclasse specifica. Si può fare questo, però:

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

Prova questo:

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>(); } 
}