最近看到C#里面的抽象类和接口,还有索引器。
看完抽象类的时候,感觉这个不错,只要在父类中写一个方法体,在子类中要引用的时候,直接override就可以。在学完接口后,感觉到接口在这方面更好,因为在C#中,类都是单根继承的,如果有多个方法,要重写的时候,那引用接口多好啊,后面增加的时候也方便。
当看到person p=new son()这个的时候,感觉有点奇怪,因为开始看的时候都是person p=new person(),或者son s=new son()的,那person p=new son()(父类引用指向子类的对象).到底有什么好处呢,如果子类中覆盖了父类中的方法,则调用子类中的方法,否则调用父类的方法。以下是引用来自的“滴d” 博客的内容。
关于父类引用指向子类对象
很多人在初次接触设计模式的时候,最大的疑惑莫过于碰到这样的句子:(父类Animal和子类Dog)
这是什么玩意儿?究竟有什么用途,我直接用子类对象不就完了?
我们就来解释一下:
--这是什么玩意儿?
re:这种用法叫做“父类引用指向子类对象”(跟绕口令似的),或者叫“父类指针指向子类对象”,指的是定义一个父类的引用,而它实际指向的是子类创建的对象。功能上相当于子类的“向上转型”,或者“上溯对象”,
上面的语句也可以写成:
Dog dog = new Dog();
a2 = dog;
将子类对象赋给父类的引用就是向上转型,Animal a2 = new Dog();中的new Dog()就是实例化一个没有名字的对象,然后转型给父类的引用a2,仅此而已。
--究竟有什么用途?
re:一般来说,一个对象实例创建完就定死了,比如dog,如果程序里的变量写dog的话,万一以后发生变化就要改代码了。那么事先就不写死dog,而是写父类Animal,那么以后用到Animal的地方,用dog实例,cat实例都可以取代,不用改实例名了。说玄乎一点,也就体现了面向对象“多态”的特性。
下面看一个很简单的例子,就更加明白了:
{
private String type = "Animal";
public virtual void showLegs()
{
Console.WriteLine("This is an {0} , Animal always has legs",type);
}
}
class Dog : Animal
{
private String type = "Dog";
public override void showLegs()
{
Console.WriteLine("This is a {0} , Dog has four legs", type);
}
}
class Glede : Animal
{
private String type = "Glede";
public override void showLegs()
{
Console.WriteLine("This is a {0} , Glede has two legs",type);
}
}
class test
{
static void Main(string[] args)
{
Animal a1 = new Animal();
Animal a2 = new Dog();
Animal a3 = new Glede();
a1.showLegs();
a2.showLegs();
a3.showLegs();
Console.ReadLine();
}
}
结果:
This is a Dog , Dog has four legs
This is a Glede , Glede has two legs
真正明白了这些,也就该接触设计模式领域了。
最后唠叨两句:
·因为a2,a3都是子类的对象,所以调用起来,也都是调用的子类的方法(当然前提是它们都override了父类方法,诸位可以试着把两个子类中的override替换成new,结果就完全不一样),有人把这叫做“关注对象原则”。
·向上转型是一定没有错的,就好比你说“狗是动物”是成立的,反之,向下转型就要注意了,你不能说“动物是狗”。
也不知道说明白没有,先下了。。。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!