我们有以下代码:
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是来自库的类,我们无法更改它们。
答案 0 :(得分:2)
Method()
会覆盖标记为虚拟和受保护的A
和B
,调用它的唯一方法(当前格式)是public class B : A
{
protected override void Method()
{
base.Method();
Console.Write("B");
}
}
以某种方式调用它/ p>
A
或直接从public class C : A
{
public void Some()
{
Method();
}
}
派生
{{1}}
virtual (C# Reference) | Microsoft Docs
virtual关键字用于修改方法,属性,索引器或 事件声明并允许在派生中重写它 类。例如,任何类都可以覆盖此方法 继承它:
<强>此外强>
调用虚方法时,对象的运行时类型为 检查一个压倒一切的成员。最重要的成员 调用派生类,如果不是,则可以是原始成员 派生类已重写成员。
受保护的成员可以在其类和派生类中访问 实例
答案 1 :(得分:0)
如果您really
希望Method
A
在此处被调用(不更改A
或B
&#39; {{1 }},你必须在下面进行更改。
将Method
班级Method
的访问说明符从B
更改为new
。
override
将覆盖基类方法。让override
无法做到。
将new
和A
类B
的访问说明符更改为Method
而不是public
protected
protected
成员A
无法在C
课程内访问。
通过此更改,请查看以下代码。您会看到来自班级Method
的{{1}}被调用。
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
:O。
答案 2 :(得分:0)
这是不可能的,因为
可以通过覆盖来更改虚拟成员的实现 派生类中的成员。
B
更改了A
的实施,因此C
仅B
实施base
而未实施A
。