如何返回通用抽象类?

时间:2009-03-09 09:55:25

标签: c#

我有这样的事情:

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;
    }
}

非常重要的是,这些类无法实例化,因为他们的委托人是私人的,所以我们不能这样做

public BaseClass<T> Method<T>(int z) where T: BaseClass<T>, new()

如何使用抽象类作为返回类型?我无法解决这个问题。非常感谢这里的任何帮助。

3 个答案:

答案 0 :(得分:2)

听起来我觉得你的方法不可能是通用的。例如,如果我打电话会发生什么:

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

您需要一个单一的事实 - 无论是类型参数还是普通参数。您可以通过使用非泛型基类(通过使现有基类非泛型,或者向其引入非泛型基类)使其成为方法参数。将Method的返回类型更改为此非泛型基类。

答案 1 :(得分:0)

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

    protected BaseClass(){}
}

可能?你不能继承我认为的静态东西......


仔细看看......我不认为你想做的事情甚至可能......你还想做什么呢?


类型约束是类型约束。您正在尝试更改方法类型中的类型约束。这显然不起作用,不应该工作。我认为你需要考虑一种不同的攻击方式。无论是什么......

答案 2 :(得分:0)

看看factory pattern。你的工厂可以有一个方法来获取实例。第一次调用它时,它会创建实例。在后续调用中,它可以返回已经创建的实例。