- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人可以解释一下这两个示例之间的区别吗?
Class A
protected virtual string GetData()
Class B
private override string GetData()
以及以下内容:
Class A
protected string GetData()
Class B
private string GetData()
假设“B 类”继承自“A 类”。
我一直假设你需要在父类(super class)中使用 virtual
并在子类中使用 override
如果你想覆盖一个方法,但是我尝试删除关键字和程序编译正常。如果有的话,到底有什么区别?
最佳答案
您展示的第二个示例隐藏了父级的 GetData,它没有覆盖它。
例子:
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
输出:
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
实际上这个示例是无效的,因为它应该在派生类的public new void Test2()
中使用new
关键字。
它就像运算符重载一样工作。它实际上并没有覆盖任何东西。当您具有确切类型 Derived
时,它会调用新方法。
您必须非常小心地隐藏成员,这与覆盖(类)或实现(接口(interface))完全不同。只有当您拥有 精确类型时,它才会调用一个 新
方法,否则它仍然会调用基类型的方法!
关于c# - 多态/覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828241/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!