2009-03-24 1 views
9

я иметь следующую структуру:Указание типа возвращаемого абстрактного метода из базового класса в соответствии с подклассом

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

    } 
} 

Я хочу создать абстрактный метод, который возвращает любой класс бетона класса саб. Итак, как вы можете видеть из примера, метод в SubOne должен возвращать List<SubOne>, тогда как метод в SubTwo должен вернуть List<SubTwo>.

Какой тип я могу указать в подписи, объявленной в базовом классе?


[UPDATE]

Спасибо за вывешенные ответы.

Решения сделать абстрактный класс родовым, как например:

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

В вашем обновление/ответ, как бы вы создать список или коллекцию класса «Base», который может содержать как SubOne и объекты SubTwo? –

ответ

18

Вашего абстрактный класс должен быть универсальным.

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

Если вам необходимо обратиться к абстрактному классу без универсального типа аргумента, использовать интерфейс:

interface IBase { 
     //common functions 
} 

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

Отлично, именно то, что я искал. Спасибо –

+0

Dang, у меня есть *, чтобы научиться печатать быстрее. –

1

Я не думаю, что вы можете получить его, чтобы быть конкретный подкласс. Вы можете сделать это, хотя:

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

Попробуйте это:

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>(); } 
} 
Смежные вопросы