2015-03-03 7 views
0

Я хочу, чтобы метод существовал в дочерних классах, но имел разные типы возвращаемых данных. Пожалуйста, просмотрите мой код ниже, чтобы понять, что я пытаюсь сделать. Есть ли способ достичь этого, о котором все знают?Общий метод в родительском классе

public abstract class MyParent 
{ 
    public abstract T GetStatus(); 
} 

public class MyChild : MyParent 
{ 
    public override StatusEnum GetStatus() 
    { 
    // Do Stuff 
    } 
} 

ответ

3
public abstract class MyParent<T> 
    where T : struct, IConvertible 
{ 
    public void EnsureTypeIsEnum() 
    { 
     if(!typeof(T).IsEnum) 
      throw new Exception("T must be an enum"); 
    } 

    public abstract T GetStatus(); 
} 

public class MyChild : MyParent<StatusEnum> 
{ 
    public override StatusEnum GetStatus() 
    { 
    // Do Stuff 
    } 
} 

T : struct является a type constraint, это мешает вам использовать класс. Поскольку ограничений Enum нет, это то, что вы должны использовать (вы можете добавить IConvertible тоже, чтобы немного ограничить тип Enum).

Если вам действительно нужно проверить, если T является Enum, то вы можете проверить его во время выполнения (я добавил метод EnsureTypeIsEnum в моем ответе)

+0

Спасибо за быстрый ответ. Почему вы указываете, что T наследуется от struct? и как бы я сделал несколько Generics для одного и того же класса (я в основном смущен тем, как отделить «wheres»)? – merp

0

Вы можете использовать переопределение на методе в дочернем классе, или что метод возврат родового объекта неявно и литой/преобразующих вернулся объект в ребёнке c как вам угодно (если вы знаете, что хотите вернуть).