我们有以下代码:
public class A
{
protected virtual void Method()
{
Console.Write("A");
}
}
public class B : A
{
protected override void Method()
{
Console.Write("B");
}
}
public class C : B
{
public void Some()
{
//How to call Method() from class A?
}
}如何在C类的Method()方法中从A类调用Some()?
我们假设A和B是库中的类,我们不能更改它们.
发布于 2018-03-14 06:01:50
B覆盖被标记为虚拟和受保护的Method()和A,唯一调用它的方法(以当前格式)是如果B以某种方式调用它。
public class B : A
{
protected override void Method()
{
base.Method();
Console.Write("B");
}
}或直接从A派生
public class C : A
{
public void Some()
{
Method();
}
}虚拟关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写该关键字。例如,继承此方法的任何类都可以重写该方法:
,
调用虚拟方法时,将检查对象的运行时类型是否为重写成员。如果没有重写派生类中的成员,则调用大多数派生类中的重写成员,该成员可能是原始成员。
受保护成员可以在其类内和通过派生类实例访问。
发布于 2018-03-14 06:12:24
如果really希望在这里调用Method of A (而不更改A或B的Method的实现),则必须进行以下更改。
Method of B类的访问说明符从override更改为new。
override将重写基类方法。让它成为new是做不到的。A和B类Method的访问说明符改为public而不是protected
protected成员的A将无法访问在您的C类。对于这些更改,请查看下面的代码。您将看到来自类Method的A正在被调用。
static void Main()
{
var c = new C();
c.Some();
Console.ReadKey();
}
public class A
{
public virtual void Method()
{
Console.Write("A");
}
}
public class B : A
{
public new void Method()
{
Console.Write("B");
}
}
public class C : B
{
public void Some()
{
//How to call Method() from class A?
((A)this).Method();
}
}如果不能进行上述更改,那么恐怕不能调用A__s Method :O。
发布于 2018-03-14 08:04:52
这不可能,因为
虚拟成员的实现可以由派生类中的重写成员进行更改。
B更改A的实现,因此C只有作为base的B实现而没有A的实现。
https://stackoverflow.com/questions/49270626
复制相似问题