c# - 动态多态性/实例创建混乱
问题描述
我在理解 C# 中的动态多态性时遇到了问题,这导致我遇到了另一个问题,即创建实例。
我知道的 :
- 动态多态性是方法覆盖。
- 继承必须发生(换句话说,我们必须有一个基类和派生类)
我有以下代码:
// Base Class
public class BClass
{
public virtual void GetInfo()
{
Console.WriteLine("Learn C# Tutorial");
}
}
// Derived Class
public class DClass : BClass
{
public override void GetInfo()
{
Console.WriteLine("Welcome to the tutorial");
}
}
class Program
{
static void Main(string[] args)
{
DClass d = new DClass();
d.GetInfo();
BClass b = new BClass();
b.GetInfo();
Console.WriteLine("\nPress Enter Key to Exit..");
Console.ReadLine();
}
}
我有两个类: BClass(父类)/DClass(派生自 BClass 的子类) 这里发生的是方法 GetInfo()(在 BClass 中)在 DClass 中被覆盖。为了使覆盖工作,我们必须添加两个关键字:virtual(在基类中),overridden(在派生类中)。如果我删除这两个关键字会怎样,所以 public void GetInfo()[base class]/public void GetInfo()[derived class]。我的输出将是相同的。我还会有
- 学习 C# 教程
- 欢迎来到教程
好像在删除关键字之前从未发生过覆盖的概念。
现在我尝试在网上搜索,发现要使覆盖生效,在 Main() 中创建的实例必须不同。
- ** BClass d = new DClass();[代替 DClass d = new DClass()]**
- ** BClass b = new BClass();**
但是为什么有人会使用 BClass d = new DClass() 而不是 DClass d = new DClass(),而我们只想创建一个 DClass 的实例。
所以总结一下:
- 我不明白多态性,因为当我删除关键字时,输出没有改变
- 我不知道如何正确创建实例,因为在某些示例中我看到: DerivedClass x = new DerivedClass(),在其他示例中 BaseClass x = new DerivedClass() 完全令人困惑。
解决方案
如果您尝试DClass
通过BClass
变量/引用调用,输出将会改变:
public class BClass
{
public virtual void GetInfo() => Console.WriteLine("In BClass");
}
// Derived Class
public class DClass : BClass
{
public override void GetInfo() => Console.WriteLine("In DClass");
}
BClass d = new DClass();
d.GetInfo();
BClass b = new BClass();
b.GetInfo();
印刷:
In DClass
In BClass
接下来:
public class BClass
{
public void GetInfo() => Console.WriteLine("In BClass");
}
// Derived Class
public class DClass : BClass
{
public void GetInfo() => Console.WriteLine("In DClass");
}
BClass d = new DClass();
d.GetInfo();
BClass b = new BClass();
b.GetInfo();
打印(并且还给你编译器警告 CS0108,它表示方法隐藏):
In BClass
In BClass
为什么 - 你可以有一个集合,BClass
你List<BClass>
可以在其中放置两个类的实例。您可以使用相同的方法来处理两者BClass
和DClass
接受父类的参数,基本上这两个类具有相同的合同并且可能共享部分实现。有关更多信息,请参阅此问题。
推荐阅读
- amazon-web-services - 无法删除的 EC2 经典资源 - 现在怎么办?
- javascript - 属性分配的Javascript不起作用
- typescript - node_module 中的类型文件夹
- c - 标识符未定义(在 C 中)
- javascript - 从 ref 节点获取数据(JavaScript 网页抓取)
- javascript - Django-React 上传图片问题
- python - numpy 2D 数组的快速/矢量化迭代和更新
- odoo - NGINX ERROR:上游在读取上游时过早关闭连接
- java - 当多个线程正在等待的锁定行被删除时,MySQL 会发生什么?
- java - Java 正则表达式非空字符串