我对方法覆盖和 OOP 原则的有效性有点困惑。我知道关于密封、阴影、覆盖、虚拟等的一切,但我遇到了一个场景,这让我很困惑。假设我有:
class classA
{
public virtual void sayhello()
{
Console.WriteLine("hello I'm A");
}
};
class classB :classA
{
public override void sayhello()
{
Console.WriteLine("hello I'm B");
}
};
class Program
{
static void Main(string[] args)
{
classB a = new classB();
a.sayhello();
}
}
根据我到目前为止研究的所有内容,可以在子类中使用override关键字覆盖声明为虚拟或抽象(在抽象类中)的方法。据此,上面的代码完美无缺。当我删除virtual关键字,然后尝试使用override关键字覆盖该方法时,编译器会给出错误:
无法覆盖继承的成员“inheritence.classA.sayhello()”,因为它未标记为虚拟、抽象或覆盖
然后我从子类中删除了覆盖关键字,并将实现提供为:
class classB :classA
{
public void sayhello()
{
Console.WriteLine("hello I'm B");
}
};
在这种情况下,可以覆盖该方法。我能够覆盖该方法,它不是虚拟的或抽象的。所以,我的问题是:
1、不违反OOP原则吗?因为我能够覆盖该方法,该方法在父级中未标记为虚拟。
2.为什么允许我以这种方式覆盖该方法?哪个甚至没有标记为virtual?
3.从classA方法中删除virtual关键字,当我试图在 classB 中覆盖该方法时,它给了我在 classA 中密封方法的感觉。(正如我之前提到的编译器错误)。如果我删除virtual,以便子类可能不会覆盖它,那么为什么子类可以巧妙地覆盖它,删除它的override关键字?仅仅是这种情况,sealed关键字是为设计的吗?