可以静态地分析被重写的方法吗?

本文关键字:重写 方法 静态 | 更新日期: 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也是一个虚方法,因为任何从该类继承的方法都可以重写