2009-03-24 15 views
9

tengo la siguiente estructura:Especificación del tipo de retorno de un método abstracto de una clase base de acuerdo con un Clase Sub

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

    } 
} 

que quieren crear un método abstracto que devuelve cualquier clase la clase sub concreto es. Entonces, como puede ver en el ejemplo, el método en SubOne debe devolver List<SubOne> mientras que el método en SubTwo debe devolver List<SubTwo>.

¿Qué tipo especifico en la firma declarada en la clase Base?


[ACTUALIZACIÓN]

Gracias por las respuestas publicadas.

La solución es hacer que la clase abstracta genérica, como por ejemplo:

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

En su actualización/respuesta, ¿cómo crear una lista o colección de la clase "base" que puede contener tanto SubOne y SubTwo objetos? –

Respuesta

18

Su clase abstracta debe ser genérico.

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

Si necesita hacer referencia a la clase abstracta sin el argumento de tipo genérico, utilizan una interfaz:

interface IBase { 
     //common functions 
} 

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

Excelente, exactamente lo que estaba buscando. Gracias –

+0

Dang, tengo * tengo * para aprender a escribir más rápido. –

1

No creo que usted puede conseguir que sea la subclase específica. Puede hacer esto sin embargo:

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

Prueba esto:

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