Animal myanimal=new Animal();
那么如下代码正确吗?
Animal myanimal=new Dog();
myanimal.Cry();
这段代码是完全正确的。既然抽象类不能实例化,那么这段代码为什么又可以运行呢?首先要明确上面的代码并没有实例化抽象类,只是声明了一个抽象类的对象myanimal,实例化时必须通过构造函数来实现,这里调用的是子类的构造函数,所以实例化的是子类对象,只是抽象类对象引用了子类实例。那么这个对象是子类还是父类呢?
using System;
public abstract class Animal
{
public abstract void Cry();
public void Show()
{
Console.WriteLine("这是抽象类中的方法");
}
}
public class Dog: Animal
{
public override void Cry()
{
Console.WriteLine("狗的叫声是汪汪");
}
public void ShowDog()
{
Console.WriteLine("这是派生类的方法");
}
}
class Progarm
{
static void Main()
{
Animal animal = new Dog();
animal.Cry();
animal.Show();
}
}
抽象类对象调用了子类的Cry()方法和本身Show()方法,子类的ShowDog()方法是不能访问的。说明抽象对象引用子类实例后,基本上还是属于抽象类,能够访问子类重写的方法和父类自己的属性和方法,子类自己的属性和方法是不能访问的。
扩展:如果有很多种动物,每个动物都要实例化,然后输出,工作量很大,也不是最佳表达方式。下面用数组来组织这些动物,主函数中的测试代码修改为以下代码
Animal[] animals=new Animal[3]{new Dog(),new Cat(),new Sheep()};
foreach (Animal a in animals)
{
a.Cry();
}
注意:抽象类的派生类必须实现所有的抽象方法,必须使用override关键字,并且不能是私有的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。