C#多态性-抽象类对象引用子类实例
C#规定,抽象类不能实例化,如下代码会发生编译错误:
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关键字,并且不能是私有的。
C#多态性-抽象类对象引用子类实例相关推荐
- 纯虚函数--抽象类中的this到底指的是哪个子类实例呢
抽象类中的this到底指的是哪个子类实例呢?请看代码: thread.h #ifndef __THREAD_H__ #define __THREAD_H__#include <iostream& ...
- java多态讲解例子_Java多态性定义与用法实例详解
本文实例讲述了Java多态性定义与用法.分享给大家供大家参考,具体如下: 多态性是通过: 1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的 2 父类和继承父类并覆盖父类中同一方法的几个不同子类 ...
- python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...
- java异常 子类_Java异常 Exception类及其子类(实例讲解)
C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...
- python类继承返回值_python继承threading.Thread实现有返回值的子类实例
继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码 import threading class mythread(threading.thread) ...
- java exception子类_Java异常 Exception类及其子类(实例讲解)
C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...
- python-面向对向-实例方法的继承-多继承父类中的super与子类实例对象的关系
初始代码 class Father:def run(self):print('father de run')def one(self):print('father de one')class Moth ...
- python类继承实例_python类继承与子类实例初始化用法分析
这篇文章主要介绍了python类继承与子类实例初始化用法,实例分析了Python类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 [ 先贴参考书籍原文(中文英文对照)] __init__方法介 ...
- java判断接口对象是哪个子类_Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例。...
Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例. 更多相关问题 -Do you know a has just opened in our neighborh ...
最新文章
- HTML样式以及使用
- 女程序员也有 35 岁危机焦虑吗?
- 排查Java线上服务故障的方法和实例分析
- tomcat正常启动但是访问 404
- 【Linux】虚拟机 Ubuntu sudo指令实现Gparted安装和 dsv/sda1 内存扩展
- umask 和 新建文件、目录的默认权限
- Unity Built-in Shader转URP Shader 接口查询对照表
- .NET Core 迁移躺坑记续集--Win下莫名其妙的超时
- inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题
- HTML中关于图像和表格,链接等的知识
- Android Sdk 安装配置
- 并联机器人市场呈现快速增长之势
- 关于各种无法解析的外部符号问题的相应解决方案【转】
- drawforeground只有鼠标事件进入才刷新_罗技各系鼠标测评(2020年12月更新)
- Gson反序列化详解
- Google Reader 使用技巧及OPML订阅源分享
- python 循环十次_python机器学习——十次交叉验证训练的数据准备算法
- C语言·XDOJ练习·拼数字
- 区间贪心:最小区间覆盖问题、PIPI的高速公路
- 地图php,php调用google地图