通用方法声明

时间:2012-05-28 14:51:48

标签: c# generics

我有类的层次结构:

class A{}
class B: A {}
class C:B {}

是否可以在类A中实现方法,并且它将由派生类B和C等继承,并且该方法应该返回类类型的值?

A val = A.method(); (val is A)
B val = B.method(); (val is B)
C val = C.method(); (val is C)

我不想在调用这种方法时使用泛型,即:

C val = C.method<C>();

伙计们,请原谅我,这个方法应该是静态的。

我不想在方法istelf中使用泛型,因为它强制指向该方法应该返回的点类型,而方法应该返回其类的类型。

class A
    {
      Method<T>()
      {
         T result;
         return result;
      }
    }

如果我有这样的方法,我可以改变返回类型:

D result = A.Method<D>();

但我希望它返回A类的值;

3 个答案:

答案 0 :(得分:3)

不,这是不可能的。

要调用方法,它必须是静态的,并且不会继承静态方法。

使用B.method()A中调用静态方法与使用A.method()相同。编译器只使用该类型来确定方法的位置,但该方法无法知道是使用A还是B类型调用它。

答案 1 :(得分:2)

使用C ++中的一些设计模式可以使这更容易:

class A
{
    protected virtual A method_impl() { return new A(); }
    public A method() { return method_impl(); }
}

class B : A
{
    protected override A method_impl() { return new B(); }
    public new B method() { return (B)method_impl(); }
}

class C : B
{
    protected override A method_impl() { return new C(); }
    public new C method() { return (C)method_impl(); }
}

当然,这个确切的问题从未出现在C ++中,它允许使用协变返回类型进行覆盖。


另一种方法,使用IoC模式:

class A
{
    protected virtual void method_impl(A a) { a.initialize(); }
    public A method() { A result = new A(); method_impl(result); return result; }
}

class B : A
{
    public new B method() { B result = new B(); method_impl(result); return result; }
}

class C : B
{
    public new C method() { C result = new C(); method_impl(result); return result; }
}

答案 2 :(得分:2)

使用扩展方法:

class Program
    {
        static void Main(string[] args)
        {
            B x = new B();
            x.Method();
        }
    }

    public static class Ext
    {
        public static T Method<T>(this T obj)
            where T : A,new()
        {
            return new T();
        }
    }

    public class A
    {

    }

    public class B : A
    {

    }

或其变体。请注意,您必须具有一些能够创建指定类型的实例的公共成员。为了阐述,编译器'猜测'类型参数的值。该方法仍然是通用的,但是当调用该方法时(通常),通用语法无处可见。