2015-02-18 3 views
0
 public abstract class Base 
     { 
     public Base ClassReturn() 
     { 
      return this; 
     } 
     } 

Есть ли возможность вернуть дочерний тип, который вызвал метод ClassReturn? Я сделал, что в методе расширения:Тип возвращаемого ребенка в Родительском классе

public static T ClassReturn<T>(this T obj) where T : Base 
     { 
      return (T) obj.ClassReturn(); 
     } 

Но я хочу embeed его в базовом классе вместо метода расширения. Есть ли возможность сделать это с помощью дженериков?

Я скопировать мой комментарий, который описывает то, что я хочу добиться:

мне нужно что-то похоже на строитель шаблона и у меня есть разные классов, в зависимости от предыдущих операций делать что-то еще, теперь я хочу имеют одинаковые функциональные возможности в каждом из них, и когда я использую , я теряю тип объекта. Поэтому мое решение либо реализует функцию несколько раз в каждом классе, либо создает расширение . Но я всегда думал, когда можно сделать расширение метод для класса, тогда я могу использовать его в классе, но, как я вижу, невозможно.

Полный пример:

public class Child1 : Base 
     { 
      public Child1 Operation1() 
      { 
       Console.WriteLine("operation1"); 
       return this; 
      } 
     } 

     public class Child2 : Base 
     { 
      public Child2 Operation2() 
      { 
       Console.WriteLine("operation2"); 
       return this; 
      } 
     } 



     static void Main(string[] args) 
     { 
      Child1 ch = new Child1(); 
      ch.Operation1().Operation1().ClassReturn().Operation1() 
     } 

Я не могу использовать operation1 после ClassReturn, если я не использую метод расширения.

+0

Что вы пытаетесь достичь? Вы даже должны знать, что дочерний класс существует в базовом классе. Btw, если вы хотите, вы можете просто переместить этот метод расширения в базовый класс, просто удалив параметр и удалив статический модификатор. –

+0

Ваш вопрос спрашивает, возможно ли вернуть этот тип, но ваш примерный код возвращает экземпляр Type. Вы пытаетесь проверить тип дочернего элемента в базовом классе? –

+0

Предположим, что класс Child1, который наследует базовый класс, вызывает ClassReturn() без метода расширения, в результате я получаю ссылку на базовый класс вместо класса Child1, что приводит к необходимости кастинга. Я хочу получить экземпляр класса Child1, если я вызываю его как Child1 и получаю экземпляр класса Child2, если я вызываю его как Child2. @SriramSakthivel это не сработает, потому что я не могу получить дочерний родовой тип – MistyK

ответ

0

С вашего вопроса и ваших комментариев, то, чего вы пытаетесь достичь, невозможно непосредственно из системы типов. Вернув экземпляр Base, вы говорите, что все, что вас интересует, это то, что у вас есть что-то, что происходит от Base, но что конкретный класс не имеет значения. Статически компилятор больше не имеет информации, необходимой для выполнения броска.

Если вы пытаетесь вернуть исходный тип назад статически, вам необходимо предоставить информацию компилятору, и в этом случае вы не можете гарантировать, что у вас есть правильная информация. В приведенном ниже примере экземпляр создается из производного типа A, но при попытке быть перенесенным в производный тип B через расширение, компилятор позволит компилировать код, но вы получите исключение во время выполнения.

public class A : Base { } 
public class B : Base { } 

public static class BaseExtensions 
{ 
    public static T GetAsT<T>(this Base base) where T: Base 
    { 
     return (T)base; 
    } 
} 


public static void Main() 
{ 
    Base obj = new A(); 
    B b = obj.BaseAsT<B>(); // This compiles but causes an exception 
} 

Вы должны смотреть вверх Liscov Substitution Principle, чтобы получить информацию о том, как правильно работать с базой и производных классов в системе в целом, а затем подправить вопрос, конкретно с результатом, который вы пытаетесь достичь.

2

Попробуйте один это:

public abstract class Base<T> where T: Base<T> 
{ 
    public T ClassReturn 
    { 
     get { return (T)this; } 
    } 
} 

public class Child1 : Base<Child1> 
{ 
} 

public class Child2 : Base<Child2> 
{ 
} 
Смежные вопросы