【发布时间】:2019-02-11 18:01:58
【问题描述】:
之前我问了一个没有得到完全回答的问题,因此我决定重新提出我的问题以了解发生了什么:
这是我的类层次结构:
interface I
{
void f();
}
class A : I
{
// non virtual method
public void f()
{
Debug.Log("---->> A ");
}
}
class B : A
{
// non overriding but hiding class A method
public void f()
{
Debug.Log("---->> B ");
}
}
class C : I
{
// non virtual method
public void f()
{
Debug.Log("---->> C ");
}
}
这里是执行代码:
Random rnd = new Random();
var randomI = rnd.Next(0, 2);
I i = null;
if (randomI == 0)
{
i = new B();
}
else
{
i = new C();
}
i.f();
就像现在一样,它要么输出A,要么输出C。它不会输出B。
问题来了:您能否解释一下如何通过这些步骤来决定调用哪个函数?
- 何时决定调用哪个函数 - 运行时或编译时?
- 如何决定调用什么函数的机制是什么?
【问题讨论】:
-
@Neil 为什么你认为这段代码在某处被使用,它可以用于教育目的?
-
我遇到过使用这些边缘案例的(专业)代码,当新开发人员看到它时,他们不明白为什么它有时会起作用,它总是涉及大量的谷歌搜索/SO 和误解.我想你会收到编译器警告。听他们的。
-
这是在unity里面吗?
-
@Narek 如果要显示
B,请将B更改为class B : A, I。 -
在
B中隐藏方法会产生编译器警告是有原因的——这正是提醒您注意不会以明显方式调用方法的事实。