[英]C# - Inheritance, override
我可以这样做吗? (过度简化,因为它太复杂了)
abstract class A {
public string Print() {}
public static string DoPrint(A a, Type T) {
((T)a).Print(); // <-- This should call eg. A3.Print(), not A.Print()
}
}
class A1: A {
public new string Print() {}
}
class A2: A {
}
class A3: A {
public new string Print() {}
}
class Somewhere
{
A3 a3 = new A3();
a3.DoPrint();
}
我有许多继承自基类的类(A1,A2,A3等)(A)
我正在尝试在A类中创建上面的DoPrint()函数。可以这样做吗?
我试过这个
public static string DoPrint(A a) {
a.Print();
}
但它调用A.Print(),而不是A3.Print()
编辑:更改标题“将类型作为参数传递?” 因为每个人都是对的,我可以使用虚拟(谢谢!)。 这个问题在其他地方撒谎,与这个问题无关。
public static string DoPrint(A a) {
a.Print();
}
会工作,但你需要将Print声明为虚拟并覆盖它。
abstract class A {
public virtual string Print() {}
public static string DoPrint(A a) {
a.Print();
}
}
class A1: A {
public override string Print() {}
}
class A2: A {
public override string Print() {}
}
class A3: A {
public override string Print() {}
}
class Somewhere
{
A3 a3 = new A3();
A.DoPrint(a3);
}
而不是使用new,将基类'Print方法标记为虚拟,然后在子类方法声明中使用override。
public virtual string Print() { }
在子类中:
public override string Print() { }
基本上没有。 你不能。 除非你进入反射级别并通过它找到并调用T
上定义的Print
方法。 任何类似接口或dynamic
东西都会选择最顶层的实现。
但是,我想知道这里的Print()
是否应该是virtual
:
abstract class A {
public abstract string Print();
}
class A1: A {
public override string Print() {}
}
class A2: A {
public override string Print() {}
}
class A3: A {
public override string Print() {}
}
然后调用a.Print();
。 然后,多态性将调用Print()
的派生最多的覆盖。
普通的虚方法和继承有什么问题? 看看虚拟和覆盖的使用:
abstract class A {
public virtual string Print() {}
public static string DoPrint(A a) {
a.Print(); // <-- This WILL call eg. A3.Print(), not A.Print()
}
}
class A1 : A
{
public override string Print() {}
}
class A2 : A
{
public override string Print() {}
}
class A3 : A
{
public override string Print() {}
}
DoPrint()
是一个静态函数。
你应该这样称呼它:
A3.DoPrint(a3, typeof(A3));
要么
A3.DoPrint(a3, a3.GetType());
现在,我不明白你为什么要那样做。 为什么不在A
类中简单地使用虚拟Print()
并在派生类中覆盖它?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.