1

我有类的层次结构:

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 类型的值;

4

3 回答 3

3

不,那是不可能的。

要像这样调用该方法,它必须是静态的,并且静态方法不是继承的。

使用B.method()调用静态方法A与使用相同A.method()。编译器只是使用类型来确定方法在哪里,但是方法不可能知道它是否使用AorB类型调用。

于 2012-05-28T15:30:32.247 回答
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; }
}
于 2012-05-28T14:59:43.753 回答
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
    {

    }

或其变体。请注意,您必须有一些能够创建指定类型实例的公共成员。为了解释,编译器“猜测”类型参数的值。该方法仍然是通用的,但是在调用该方法时(通常)看不到通用语法。

于 2012-05-28T15:14:45.513 回答