1.1继承与多态的基本概念

1.1.1 继承和多态

继承是面向对象程序设计的主要特征之一,允许重用现有类(基类,亦称超类、父类)去创建新类(子类,亦称派生类)的过程。子类将获取基类的所有非私有数据和行为,可以定义其他数据和行为。

派生类具有基类所有非私有数据和行为以及新类自己定义的所有其他数据或行为,即子类具有两个有效类型:子类的类型和它继承的基类的类型。

对象可以表示多个类型的能力称为多态性。

多态性示例。

 public class Parent
{
public Parent() { }
public void MethodA()
{
Console.WriteLine("调用MethodA()");
}
public class Child:Parent
{
public Child() { } public void MethodB()
{
Console.WriteLine("调用MethodB()");
} }
class Test
{ static void Main(string[] args)
{ Parent oParent = new Parent();
oParent.MethodA();//OK 调用类型Parent的成员方法
//Child oChild1 = (Child)oParent;//运行错误
Child oChild=new Child();
oChild.MethodB();//OK 调用派生类Child的成员方法
oChild.MethodA();//OK 调用基类Parent的成员方法
Parent oParent1 =(Parent)oChild;
oParent1.MethodA();
//oParent1.MethodB();//编译出错,类型Parent不存在方法MethodB()
Console.ReadLine();
Child oChild1 = (Child)oParent1;
oChild1.MethodB();//OK 调用派生类Child的成员方法
oChild1.MethodA();//OK 调用基类Parent的成员方法
Console.ReadKey(); }
} }

程序运行结果:

在上例中,类Child既有效的Child,又是有效的Parent。oChild可以作为类型Child,因而具有Child本身定义的方法MethodB()和基类Parent定义的方法MethodA();同时,对象oChild也可以强制转换为Child的基类Parent的对象oParent。强制转换不会更改oChild对象的内容,但oParent对象作为类型Parent,因而只具有类Parent定义的方法MethodA()。

将Child强制转换为Parent后,可以将该Parent重新强制转换为Child。并只有实际上是Child实例的那些实例才可以强制转换为Child,否则会产生运行错误:无法将类型为Parent的对象强制转换为类型Child。

1.1.2  继承的类型

C#包含两种继承类型:实现继承和接口继承。

现继承表示一个类型派生于一个基类型,派生类具有基类的所有非私有(非Private)数据和行为。在实现继承中,派生类型的每一个方法采用基类型的实现代码,除非在派生类的定义中指定重写该方法的实现代码。实现继承一般用于增加现有类型的功能,或许多相关的类型共享一组重要的公共功能场合。

接口继承表示一个类型实现若干接口,接口仅包含方法的签名,故接口继承不继承任何实现代码。接口继承一般用于指定该类型具有某类可用的特性,例如,如果指定类型从接口System.IDisposable中派生,并在该类中实现IDisposable接口的清理资源的方法Dispose(),则可以通过工通的机制调用该方法以清理资源。由于清理资源的方式特定于不同的类型,故在接口中定义通用的实现代码是没有意义的,接口即契约,类型派生于接口,即保证该类提供该接口规定的功能。

C# 读书笔记之继承与多态的更多相关文章

  1. 新标准C++程序设计读书笔记_继承和多态

    简单继承的例子: #include <iostream> #include <string> using namespace std; class CStudent { pri ...

  2. 0022 Java学习笔记-面向对象-继承、多态、组合

    继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...

  3. Java编程思想学习笔记_2(继承和多态)

    静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...

  4. 初读"Thinking in Java"读书笔记之第八章 --- 多态

    再论向上转型 在某些方法中,仅接收基类作为参数,而不是特殊的导出类,会使得程序更容易扩展. 转机 方法调用绑定 前期绑定(编译期绑定):在编译期将一个方法调用和方法主体关联起来. 后期绑定(动态绑定或 ...

  5. Python笔记(三)继承和多态、动态语言

    一.继承 先定义一个A类 class A(object): def fun(self): print "Run A fun()" 在定义一个B类 class B(A): pass ...

  6. 《Javascript高级程序设计》读书笔记之继承

    1.原型链继承 让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法 function SuperType() { this.property=true; } ...

  7. 【Java编程思想读书笔记】继承中父类的初始化方式

    继承中父类的初始化方式 p144页有感 一.提出问题 假设有一些类,这些类有继承关系的时候,当初始化一个子类对象,对于该类的父类而言,发生了什么呢?是仅仅只是复制了一个引用还是也会同时new一个父类对 ...

  8. <EffectiveJava>读书笔记--01继承的使用注意

    1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该 ...

  9. 《C#图解教程》读书笔记之四:类和继承

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...

随机推荐

  1. Jave中System.getProperty()获取的值

    java.version Java 执行时环境版本号 java.vendor Java 执行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装 ...

  2. JS实现快排

    /*采用快排的方法排序,取第一个值为轴对数组进行分割排序,不断迭代后实现数组的排序*/ //定义分割函数 function partF(A,low, high){ var temp = A[low]; ...

  3. CentOS修改系统默认语言与编码

    有时候在安装CentOS无意中把默认语言设置为中文,而部分SSH软件不支持中文编码,所以在远程管理的时候会出现些乱码的现象.   如何修改CentOS的默认语言呢? 请先使用root权限帐户登陆 一. ...

  4. linux查看与开启ssh

    首先通过物理终端进入到linux上,手工检查ssh发现没运行/etc/init.d/sshd statussshd is stopped手工启动服务,发现报告权限错误./etc/init.d/sshd ...

  5. webService接口大全

    中文<->英文双向翻译WEB服务 获得标准数据 Endpoint: http://fy.webxml.com.cn/webservices/EnglishChinese.asmx Disc ...

  6. BZOJ 1832: [AHOI2008]聚会( LCA )

    LCA模板题...不难发现一定是在某2个人的LCA处集合是最优的, 然后就3个LCA取个最小值就OK了. 距离就用深度去减一减就可以了. 时间复杂度O(N+MlogN) (树链剖分) -------- ...

  7. 虚拟机NAT模式主机ping不通虚拟机解决方案

    本篇没有抓包,只是简单一个实施.需要的童鞋可以拿走这个方法. 虚拟机与真机通信三种模式, 桥接模式,NAT 模式 ,HOST 模式. 桥接就是在真机的网络上模拟一个网卡,给虚拟机申请一个和真机在同一个 ...

  8. 【原创】Libjpeg 库使用心得(一) JPEG图像DCT系数的获取和访问

    [原创]继续我的项目研究,现在采用Libjpeg库函数来进行处理,看了库函数之后发现C语言被这些人用的太牛了,五体投地啊...废话不多说,下面就进入正题. Libjpeg库在网上下载还是挺方便的,这里 ...

  9. RedHat/CentOS发行版本号及内核版本号对照表

    RedHat/CentOS发行版本号及内核版本号对照表 : Redhat 9.0———————————————2.4.20-8RHEL 3 Update 8————————————2.4.21-47R ...

  10. Eclipse启动后一直Initializing Java Tooling (1%)

    问题症状: 工作中eclipse崩溃,再次启动后cpu占用99%,状态栏一直显示Initializing Java Tooling: (1%). 解决方案: 删除\workspace\.metadat ...