.NET中的类的继承问题,请高人来指点!

cpplm 2009-12-10 05:25:37
定义Animal为父类,Dog为Animal的子类
那么下面有三种情况
Dog dog=new Dog();
Animal animal=new Animal();
Animal abc=new Dog();
那么这三者之间有什么差异?
abc在这里等同与dog还是animal?
或者是加强版的animal还是阉割版的dog?
他的权限跟dog相同还是animal相同?
...全文
159 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpplm 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 vrhero 的回复:]
什么加强版阉割版,哪来什么权限之说...

dog实例和abc实例是完全相同的,唯一不同的是它们各自具有不同的类型,也就是说只有引用不同实例是相同的...而animal实例和前两者没有直接关系,只有类型上的联系...

不要说什么“子类的方法父类不能调用所以dog对象和abc对象不同”的外行话...比如你是个人类,可现在不知道你是男人还是女人,所以不能调用你的属于男人或女人的方法,但这不能改变你是个确定的男人类或女人类的实例,和其它男人类或女人类的实例没有不同...除非你是春哥或曾哥...
[/Quote]

信春哥,学C#!
tkscascor 2009-12-10
  • 打赏
  • 举报
回复
...16l最后一句是亮点。
vrhero 2009-12-10
  • 打赏
  • 举报
回复
什么加强版阉割版,哪来什么权限之说...

dog实例和abc实例是完全相同的,唯一不同的是它们各自具有不同的类型,也就是说只有引用不同实例是相同的...而animal实例和前两者没有直接关系,只有类型上的联系...

不要说什么“子类的方法父类不能调用所以dog对象和abc对象不同”的外行话...比如你是个人类,可现在不知道你是男人还是女人,所以不能调用你的属于男人或女人的方法,但这不能改变你是个确定的男人类或女人类的实例,和其它男人类或女人类的实例没有不同...除非你是春哥或曾哥...
woshifou 2009-12-10
  • 打赏
  • 举报
回复
学习。
cpplm 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hhc123 的回复:]
Animal al = new Dog();
Animal a = new Animal();这两个表面上看不一样,其实差不多,根本访问不到Dog中的东西
Dog dog = new Dog();这个是最终版,上可访问父类,下可访问自己

[/Quote]

对的,但如果父类的方法在子类被重写,a1就按照子类的方法进行构造,所以说a1是a的加强版
cpplm 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 awpszq 的回复:]
这么说吧 abc是Dog类型的 与dog一摸一样

abc的权限 相当于dog的权限

可以访问父类的非private成员 复写虚函数

Animal abc = new Dog();
Dog abc = new Dog();

这两条语句是等价的

LZ明白否?
[/Quote]

这两者绝对不是等价的,我已经代码验证过了,子类中的一些方法父类怎么可能调用?
比如Animal里定义一个Eat()的方法
Dog继承并重写,然后重新定义一个Color()
那么Animal abc=new Dog();
这时的abc.Eat()是有的,并且跟Dog重写后的一样
但是abc.Cololr()是不存在的
peter20091001 2009-12-10
  • 打赏
  • 举报
回复
用基类定义一个对象,用派生类实例化这个对象时,
如果使用new隐藏基类虚方法时(加vitual就是虚方法),这个对象调用被隐藏的方法时,结果只执行基类方法;
如果使用override重载基类非虚方法时,调用被重载的方法,基类和派生类中的方法都执行。
非虚方法只能重载,虚方法只能隐藏。
awpszq 2009-12-10
  • 打赏
  • 举报
回复
这么说吧 abc是Dog类型的 与dog一摸一样

abc的权限 相当于dog的权限

可以访问父类的非private成员 复写虚函数

Animal abc = new Dog();
Dog abc = new Dog();

这两条语句是等价的

LZ明白否?
xinloveminnie 2009-12-10
  • 打赏
  • 举报
回复
复习下继承...
tkscascor 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cpplm 的回复:]


这个是我写的,如果我把Chicken的override去掉的话那么输出的是Bird,否则的话是Chicken!
个人感觉这里的abc应该是加强版的Animal,而不是阉割版的Dog,毕竟abc是Animal类型的,不知道对不对,还有就是权限的问题,这里的abc的权限跟谁的有关?
[/Quote]
abc与dog 对象是一样的. 没有差异.
dog类是在animal类继承的. 也就是说, 功能要比父类多,所以abc对象是animal对象的加强版. 如此是否清楚一点?
hhc123 2009-12-10
  • 打赏
  • 举报
回复
Animal al = new Dog();
Animal a = new Animal();这两个表面上看不一样,其实差不多,根本访问不到Dog中的东西
Dog dog = new Dog();这个是最终版,上可访问父类,下可访问自己
awpszq 2009-12-10
  • 打赏
  • 举报
回复
Animal abc = new Dog();

这个abc等同于 Dog dog = new Dog(); 的dog

其实之前实例化abc的时候 abc具有的属性和方法就和dog一样了 因为声名时用的是new Dog()

abc和dog一样 都可以访问父类(Animal)的非私有的属性和方法

也同样可以复写父类的虚方法
cpplm 2009-12-10
  • 打赏
  • 举报
回复
namespace 继承
{
public abstract class Animal
{
public abstract void ShowType();
public void Eat()
{
Console.WriteLine("Animal always eat.");
}
}

public class Bird:Animal
{
private string type = "Bird";
public override void ShowType()
{
Console.WriteLine("Type is {0},Bird类的调用",type);
}
private string color;
public string Color
{
get { return color; }
set { color = value; }
}
}

public class Chicken : Bird
{
private string type = "Chicken";
public override void ShowType()
{
Console.WriteLine("Type is {0},Chicken类的调用",type);
}
}
}


这个是我写的,如果我把Chicken的override去掉的话那么输出的是Bird,否则的话是Chicken!
个人感觉这里的abc应该是加强版的Animal,而不是阉割版的Dog,毕竟abc是Animal类型的,不知道对不对,还有就是权限的问题,这里的abc的权限跟谁的有关?
tkscascor 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zsc8917zsc 的回复:]
这个就是面向对象里的多态 去看看关于多态的资料
[/Quote]
我认为 这个不是多态的问题. lz关心的是这几个实例的对象的差异,!
hhc123 2009-12-10
  • 打赏
  • 举报
回复
1Animal animal=new Animal(); //访问不到Dog中的public属性
2Dog dog=new Dog(); //这个自然可以
3Animal abc=new Dog(); //这个也访问不到Dog中的Public属性

你动手写一下这几个类,你就明白的很
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication35
{
class Animal
{
public int i = 0;
int j = 0;

}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication35
{
class Dog:Animal
{
public int k= 9;

public string ReturName()
{
return "你好";

}
}
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication35
{
class Program
{
static void Main(string[] args)
{
Animal al = new Dog();
Animal a = new Animal();
Dog dog = new Dog();

}
}
}


我给你写好好算了,你去调用一下就知道了
zsc8917zsc 2009-12-10
  • 打赏
  • 举报
回复
这个就是面向对象里的多态 去看看关于多态的资料
tkscascor 2009-12-10
  • 打赏
  • 举报
回复
子类与父类的关系, 子类可以替代父类,父类不能替代子类, 这个原则貌似 叫里氏置换原则.
三者的差异
animal 是父类.abc等同于dog,理论上说父类与子类的关系, 子类可以替换父类.就是当使用animal这个对象的时候, 它的方法, 属性可以被dog或者abc子类的方法,属性来代替.
换句话说 dog跟abc 是animal的加强版.
hhc123 2009-12-10
  • 打赏
  • 举报
回复
其实你写得很清楚了,自己动手建几个类不就知道了吗?
  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

111,120

社区成员

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

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

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