您的位置:首页 > 其它

关于父类引用指向子类对象

2008-10-30 16:27 204 查看
很多人在初次接触设计模式的时候,最大的疑惑莫过于碰到这样的句子:(父类Animal和子类Dog)

Animal a2 = new Dog();

这是什么玩意儿?究竟有什么用途,我直接用子类对象不就完了?

我们就来解释一下:

--这是什么玩意儿?

re:这种用法叫做“父类引用指向子类对象”(跟绕口令似的),或者叫“父类指针指向子类对象”,指的是定义一个父类的引用,而它实际指向的是子类创建的对象。功能上相当于子类的“向上转型”,或者“上溯对象”,

上面的语句也可以写成:

Animal a2 = new Animal();

Dog dog = new Dog();

a2 = dog;

将子类对象赋给父类的引用就是向上转型,Animal a2 = new Dog();中的new Dog()就是实例化一个没有名字的对象,然后转型给父类的引用a2,仅此而已。

--究竟有什么用途?

re:一般来说,一个对象实例创建完就定死了,比如dog,如果程序里的变量写dog的话,万一以后发生变化就要改代码了。那么事先就不写死dog,而是写父类Animal,那么以后用到Animal的地方,用dog实例,cat实例都可以取代,不用改实例名了。说玄乎一点,也就体现了面向对象“多态”的特性。

下面看一个很简单的例子,就更加明白了:

class Animal

{

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 an Animal , Animal always has legs

This is a Dog , Dog has four legs

This is a Glede , Glede has two legs

真正明白了这些,也就该接触设计模式领域了。

最后唠叨两句:

·因为a2,a3都是子类的对象,所以调用起来,也都是调用的子类的方法(当然前提是它们都override了父类方法,诸位可以试着把两个子类中的override替换成new,结果就完全不一样),有人把这叫做“关注对象原则”。

·向上转型是一定没有错的,就好比你说“狗是动物”是成立的,反之,向下转型就要注意了,你不能说“动物是狗”。

也不知道说明白没有,先下了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: