可以静态地分析被重写的方法吗?
本文关键字:重写 方法 静态 | 更新日期: 2023-09-27 18:12:41
在这种情况下:
interface Interfaz
{
void M1();
}
abstract class ClaseAbstracta : Interfaz
{
public void M1() { }
public abstract Boolean M2();
}
class ClaseConcreta : ClaseAbstracta
{
public override Boolean M2() { return false; }
public virtual void M3(Int32 i) { }
public void M4() { }
}
我也这样做:
ClaseConcreta concretaCast = (ClaseConcreta) abst;
concretaCast.M2()
可以静态分析吗?
首先,它有override
,所以看起来它不能,但当你看到M2()
时,它实际上是具体的实现。
所以这是静态可分析的,还是每次它有覆盖,它必须在运行时动态地做?
我怀疑这在一般情况下是否可以进行静态分析。考虑:
class ClaseConcreta2 : ClaseConcreta
{
public override Boolean M2() { return true; }
}
void Main()
{
var x = new ClaseConcreta2();
DoSomething(x);
}
void DoSomething(ClassAbstracta abst)
{
ClaseConcreta concretaCast = (ClaseConcreta) abst;
// okay, so it's a ClaseConcreta, but what kind?
}
, 可以有时:
void DoNothingReally(ClaseAbstracta x)
{
ClaseConcreta y = new ClaseConcreta();
y.M2(); // Only possibly the implementation from ClaseConcreta.
ClaseAbstracta abst = y;
ClaseConcreta concretaCast = (ClaseConcreta) abst;
concretaCast.M2(); // Only possibly the implemenation from ClaseConcreta, but more work to figure this out.
x.M2(); // can't know where the implentation is from generally, but see below
}
void DoMoreNothing()
{
DoNothingReally(new ClaseConcreta());//the call x.M2() above will only possibly the implemenation from ClaseConcreta but lots of work to figure that out.
}
现在,另一个问题是是否有任何将决定这一点。在关于c++的文章中,Bjarne Stroustrup谈到了一个事实,即编译器可以将虚拟调用替换为非虚拟调用作为一种优化。我不知道c++中有多少是这样做的,更不用说c#了。这在理论上是可行的。
我想我明白了。
我将是动态的,并在运行时分析。
原因是override也是一个虚方法,因为任何从该类继承的方法都可以重写