我有类的层次结构:
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类的值;
答案 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
{
}
或其变体。请注意,您必须具有一些能够创建指定类型的实例的公共成员。为了阐述,编译器'猜测'类型参数的值。该方法仍然是通用的,但是当调用该方法时(通常),通用语法无处可见。