C# 父类引用子类对象问题求解

freelooppowter 2016-07-22 05:56:17
代码如下:
using System;
namespace Inhertied
{
public class Father
{
public void DoWork()
{
Console.WriteLine("Father.DoWork()");
}
public virtual void DoVirtualWork()
{
Console.WriteLine("Father.DoVirtualWork()");
}
public virtual void DoVirtualAll()
{
Console.WriteLine("Father.DoVirtualAll()");
}
}
public class Son:Father
{
public static void DoStaticWork()
{
Console.WriteLine("Son.DoStaticWork()");
}
public new void DoWork()
{
Console.WriteLine("Son.DoWork()");
}
public new virtual void DoVirtualWork()
{
base.DoVirtualWork();
Console.WriteLine("Son.DoVirtualWork()");
}
public override void DoVirtualAll()
{
Console.WriteLine("Son.DoVirtualAll()");
}
}
public class Grandson:Son
{
public override void DoVirtualWork()
{
base.DoVirtualWork();
Console.WriteLine("Grandson.DoVirtualWork()");
}
public override void DoVirtualAll()
{
base.DoVirtualAll();
Console.WriteLine("Grandson.DoVirtualAll()");
}
}
class IL_Method_Test
{
public static void Main()
{
Father son=new Son();
son.DoWork();
son.DoVirtualWork();

Son.DoStaticWork();

Father grandson=new Grandson();
grandson.DoWork();
grandson.DoVirtualWork();
grandson.DoVirtualAll();

Console.ReadKey();
}
}
}
//输出结果如下:
/*OUTPUT
Father.DoWork()
Father.DoVirtualWork()
Son.DoStaticWork()
Father.DoWork()
Father.DoVirtualWork()
Son.DoVirtualAll()
Grandson.DoVirtualAll()
*/
有木有可以给我讲讲为啥输出这样的结果,new 、override、new virtual分别起到什么作用??
...全文
224 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2016-07-26
  • 打赏
  • 举报
回复
new 修饰符最好不要用,有override覆盖就够了 Father son=new Son();这种代码也很诡异,少用吧
freelooppowter 2016-07-25
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
new 跟你标题中说的“继承”其实就是一个“截断、反动”的关系。 它如此容易产生误会,而又没有什么必要(你可以轻松地为私有方法另起名字),所以它很有害。 例如 .net 类库中有些常用的类,它有一个 ToList 方法,另外又有一个 InnerList 的方法,两个方法都能返回内部数据的集合。但是两个方法的的意义不一样,前者可以拿到父类、接口的测试环境里进行测试,是满足面向对象基本原则(第一原则)的。后者返回的内部数据的集合,其实跟前者返回的内部数据的集合的特性根本不同,例如只是一个静态快照而并不能随着对象的其它属性的改变而自动改变数据集合的内容。于是设计者就明智地用私有名字来为这个方法起名。 当你调用时,你需要后者的功能,就调用 InnerList。你需要前者的功能,就调用前者的方法。 子类若不想让人调用从父类继承的方法,可以在方法里边抛出异常。若不想重写父类方法,则不重写父类方法。何必要用 new 语法呢? 你如果只学一些教条,看一些语法说明,可能不会从明确地告诉你如何运用和维系面向对象设计原则。所以如果死读书,这个时候就不够了。
您说的很有道理,只是我在看《你必须知道的.NET 》一书时遇到自己当时无法理解所以发上来请教你们,我很赞同您的不能死读书的做法,自己也在编写简单代码来让自己透彻的理解这门语言。如果有什么好的学习方式,麻烦您告诉,我希望自己学的东西更注重实际,而不是理论。
freelooppowter 2016-07-25
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
override,表示这个方法重写基类的虚方法 virtual,表示这个方法可以被派生类重写 new,表示,这个方法和基类的方法没有一毛钱关系 new virtual,表示这个方法和基类没有一毛钱关系,同时它自己的派生类可以重写这个方法 所谓重写 基类 子类对象; 子类对象.方法() // 调用子类的而不是基类的 所谓没有一毛钱关系 基类 子类对象; 子类对象.方法() // 调用基类的 子类 子类对象 子类对象.方法() // 调用子类的
谢谢您给的讲解,我周末自己理解了其中的含义,new 完全可以使用一个不同的名称来命名。
wangyu0517 2016-07-23
  • 打赏
  • 举报
回复
使用的new修饰一个函数,说明基类存在一个和他名字一样的函数。为了使调用时调用当前的,而不是基类的,就用new修饰,new你可以理解为新建该函数的实现方法,新建以后,基类的函数就被隐藏了
wangyu0517 2016-07-23
  • 打赏
  • 举报
回复
其他都好理解,主要是new这个不好理解,new存在的意义,主要是解决版本兼容问题,应用于对函数名有特殊要求的情况下(通常不会,只有在更换基类函数功能,又无法重载的情况下使用),其他场合不要使用和基类相同的函数名就行了。
  • 打赏
  • 举报
回复
嗯,更正一下,我说的“面向对象基本原则的第一条原则”在网上应该是“里氏替换原则”,通常放在第二条原则。
  • 打赏
  • 举报
回复
new 跟你标题中说的“继承”其实就是一个“截断、反动”的关系。 它如此容易产生误会,而又没有什么必要(你可以轻松地为私有方法另起名字),所以它很有害。 例如 .net 类库中有些常用的类,它有一个 ToList 方法,另外又有一个 InnerList 的方法,两个方法都能返回内部数据的集合。但是两个方法的的意义不一样,前者可以拿到父类、接口的测试环境里进行测试,是满足面向对象基本原则(第一原则)的。后者返回的内部数据的集合,其实跟前者返回的内部数据的集合的特性根本不同,例如只是一个静态快照而并不能随着对象的其它属性的改变而自动改变数据集合的内容。于是设计者就明智地用私有名字来为这个方法起名。 当你调用时,你需要后者的功能,就调用 InnerList。你需要前者的功能,就调用前者的方法。 子类若不想让人调用从父类继承的方法,可以在方法里边抛出异常。若不想重写父类方法,则不重写父类方法。何必要用 new 语法呢? 你如果只学一些教条,看一些语法说明,可能不会从明确地告诉你如何运用和维系面向对象设计原则。所以如果死读书,这个时候就不够了。
姓小名白丶 2016-07-22
  • 打赏
  • 举报
回复
。。。。。。。。you need Baidu
threenewbee 2016-07-22
  • 打赏
  • 举报
回复
override,表示这个方法重写基类的虚方法 virtual,表示这个方法可以被派生类重写 new,表示,这个方法和基类的方法没有一毛钱关系 new virtual,表示这个方法和基类没有一毛钱关系,同时它自己的派生类可以重写这个方法 所谓重写 基类 子类对象; 子类对象.方法() // 调用子类的而不是基类的 所谓没有一毛钱关系 基类 子类对象; 子类对象.方法() // 调用基类的 子类 子类对象 子类对象.方法() // 调用子类的

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧