如果我有一个类A,以及继承自A的类B、C和D,是否有一种方法可以在A中编写一个方法,当在子类上调用该方法时,返回类型是子类?
因此,如果我执行A.myMethod(),我会得到一个A,如果我执行B.myMethod(),我会得到一个B的实例?
因此,如果我执行A.myMethod(),我会得到一个A,如果我执行B.myMethod(),我会得到一个B的实例?
public new B MyMethod() { return (B)(base.MyMethod()); }
B
的使用都返回一个B
,但实际上并没有覆盖A.MyMethod
的行为。在代码中避免重复类型转换非常有用。B
类型对象,则无法在同一类中共存,因为编译器看到相同的签名(相同的名称、相同的参数,即使返回类型是明确不同的)。public class A<TSelf> where TSelf : A<TSelf> { }
public class B : A<B> { }
TSelf
的对象,甚至可以将其设置为抽象方法,以便每个继承者都必须处理构造函数。但是,任何从B
继承的类在重写此方法时会更加困难,因为它继承自A<B>
,而不是A<C>
。A
中声明方法 myMethod
,您可以执行以下操作:namespace Test
{
class Program
{
static void Main(string[] args)
{
var a = new A();
var b = new B();
Console.WriteLine(a.M());
Console.WriteLine(b.M());
}
}
class A
{
public A M()
{
return (A)Activator.CreateInstance(GetType());
}
}
class B : A
{
}
}
输出:
Test.A
Test.B
M
,则这将无法正常工作。 - BradleyDotNETclass A
{
public virtual A Create()
{
return new A();
}
}
class B
{
public override A Create()
{
return new B();
}
}
当然,返回类型必须保持为基类,但由于您正在利用多态性,这不应该是问题。
通常工厂方法会在另一个专门的类中,这样您就知道了。
是和不是。考虑一下:
public class Parent
{
public int MyProperty { get; set; }
public virtual Parent MyMethod()
{
return new Parent();
}
}
public class A : Parent
{
public override Parent MyMethod()
{
return new A();
}
}
如果你在问编译时,不,你不能编写具有不同返回类型的覆盖方法。
但是在运行时,是的,你可以,并且你将拥有这些类型的实例,但你必须编写你的代码以使其具有返回类型“ A”,然后将它们转换为所需的类型。