关于覆盖与隐藏C#中的方法有点困惑.每个人的实际用途也将被理解,以及何时使用每个人的解释.
我对重写感到困惑 - 为什么要覆盖?到目前为止我所学到的是,通过覆盖,我们可以在不改变签名的情况下为派生类的方法提供所需的实现.
如果我不覆盖超类的方法并且我对子类中的方法进行了更改,那么是否会更改超类方法?
我也对以下内容感到困惑 - 这表明了什么?
class A
{
virtual m1()
{
console.writeline("Bye to all");
}
}
class B : A
{
override m1()
{
console.writeLine("Hi to all");
}
}
class C
{
A a = new A();
B b = new B();
a = b; (what is this)
a.m1(); // what this will print and why?
b = a; // what happens here?
}
Run Code Online (Sandbox Code Playgroud) 在C#中,是否可以将重写的虚拟方法标记为final,因此实现者无法覆盖它?我该怎么办?
一个例子可以让它更容易理解:
class A
{
abstract void DoAction();
}
class B : A
{
override void DoAction()
{
// Implements action in a way that it doesn't make
// sense for children to override, e.g. by setting private state
// later operations depend on
}
}
class C: B
{
// This would be a bug
override void DoAction() { }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法修改B以防止其他子C在编译时或运行时覆盖DoAction?
在讨论计算机语言的演变时,Alan Kay说他的Smalltalk最重要的一个属性是后期绑定; 它赋予语言可塑性和可扩展性,并允许不适当的耦合随着时间的推移被重构.你同意吗?是否有早期约束的补偿优势可以解释为什么它似乎是两个范式的主导,哪个域可以使用?
基于使用javascript,jQuery,jsext,actionscript,php,java,RoR和asp.net实现Web应用程序的个人经验(不是广泛或深度不具有权威性)似乎暗示了后期绑定和膨胀之间的正相关减少.早期绑定我肯定有助于检测和防止某些类型的安全错误,但自动完成和良好的IDE以及一般的良好编程实践也是如此.因此,在我的风险规避方面恢复我的理性观点之前,我倾向于抓住自己为后期约束方而生根.
但我对如何平衡权衡并没有很好的理解.