2009-03-09 8 views
1

У меня есть что-то вроде этого:Как вернуть общий абстрактный класс?

abstract class BaseClass<T> 
{ 
    protected BaseClass(){} 
} 

class Class1 : BaseClass<Class1> 
{ 
    public static Class1 Instance = new Class1(); 
    private Class1(){}   
} 

class Class2 : BaseClass<Class2> 
{ 
    public static Class2 Instance = new Class2(); 
    private Class2(){}  
} 

... 
public BaseClass<T> Method<T>(int z) where T: BaseClass<T> 
{ 
    switch(z) 
    { 
     case 1: 
      return Class1.Instance; 
     case 2: 
      return Class2.Instance; 
    } 
} 

Это очень важно, чтобы эти классы не могут быть созданы, так как их construstors являются частными, поэтому мы не можем сделать, как

public BaseClass<T> Method<T>(int z) where T: BaseClass<T>,новый()

Как могу ли я использовать абстрактный класс как возвращаемый тип? Я просто не могу это понять. Буду признателен за любую помощь здесь.

+0

Дело в том, что «Метод» похож на метод фабрики ... Вся зависимость немного усложняется, и я опубликовал как можно более простой скелет. Проблема заключается в том, что я не могу в switch switch возвращать те Class1.Instance, потому что он говорит: «Невозможно преобразовать Class1 для возврата типа BaseClass 2009-03-09 10:22:54

ответ

0
abstract class BaseClass<T> 
{ 
    public abstract T Instance { get; } 

    protected BaseClass(){} 
} 

возможно? Вы не можете наследовать статические вещи я считаю ...


На ближайшем рассмотрении ... Я не думаю, что вы пытаетесь сделать, это еще возможно ... что вы пытаетесь сделать в любом случае ?


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

+0

Это не поможет. Как вызвать свойство экземпляра, не создав экземпляр объекта? –

+0

ну, хорошая точка: p, но вы не можете наследовать статические вещи. Но в этом случае зачем ему нужно это делать с помощью статических свойств в первую очередь? – Svish

0

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

2

Звучит так, как будто у вас не может быть общего метода. Например, что случилось бы, если бы я назвал:

BaseClass<Class1> foo = Method<Class1>(2); 

Вам нужна единая точка истины - либо аргумент типа, или нормальный аргумент. Вы можете сделать его аргументом метода, имея неосновный базовый класс (либо путем создания существующего базового класса, либо не общего, либо введения для него не общего базового класса). Измените тип возвращаемого значения Method на этот не общий базовый класс.

+0

«Единая точка правды» ... Мне это нравится , –

Смежные вопросы