C#面向对象(OOP)入门—第二天—多态和继承(继承)
介绍:
第一天的内容主要是不同情形下的方法重载。这一部分则主要讲面向对象中继承的概念。首先用一个要点图形来定义继承。

继承
一个简单的例子:
ClassA: class ClassA:ClassB
{
public void Display1()
{
Console.WriteLine("ClassA Display1");
base.Display1();
}
} ClassB: class ClassB
{
public int x = 100;
public void Display1()
{
Console.WriteLine("ClassB Display1");
}
public void Display2()
{
Console.WriteLine("ClassB Display2");
}
} class Program
{
static void Main(string[] args)
{
ClassA a = new ClassA();
a.Display1();
Console.ReadKey();
}
} /*
输出结果:
ClassA Display1
ClassB Display1
*/
在如上的例子中,ClassB是父类,ClassA是子类,ClassA继承自ClassB(或ClassB派生出ClassA)。
这个例子也会得到一个警告:“ClassA.Display1()”隐藏继承的成员“ClassB.Display1()”。如果是有意隐藏,请使用关键字 new。 意思是说ClassA中的成员和ClassB中的成员一样,这样基类的就被隐藏了。如果故意为之,可以用"public new void Display1()"来代替。
知识点:我们可以在子类中定义和基类名称相同的成员,并且子类中的方法总是优先执行然后才是基类(遇到同名的情况时)。当然也可以用base关键字,在子类中调用基类中的成员。另外,继承不能向后兼容(意思就是说基类的实例无法调用派生类的成员,这很好理解)。除了构造函数和析构函数,我们可以从基类继承任何成员。
对于类的成员,有两种类型:
- 静态成员:类内带有static关键字,他属于这个类,可以直接访问
- 普通成员:通过这个类的实例来访问,他仅仅属于这个类创建的那个实例
public class ClassB
{
} public class ClassA : ClassB
{
} //编译时其实是: public class ClassB:object
{
} public class ClassA : ClassB
{
}
在C#中,如果一个类没有继承任何类,那么它也会默认继承自object类,它是所有类的共同的基类。另外一些特殊的类如:System.ValueType、System.Delegate等无法继承。
再看一个例子:
public class ClassW
{
} public class ClassX
{
} public class ClassY : ClassW, ClassX
{
}
这样定义ClasssY时,会报错。知识点:在C#,一个类只能继承自一个类,不支持多继承。(其实C#的多继承可以通过接口来完成)
再看一个例子:
public class ClassW:ClassY
{
} public class ClassX:ClassW
{
} public class ClassY : ClassX
{
}
这样也会报错:涉及“ClassY”和“ClassW”的循环基类依赖项....(3个错误)
知识点:C#中不允许循环相依(Circular dependency)。也就是互相继承
再看一个例子:
public class ClassB
{
public int b = 100;
} public class ClassA:ClassB
{
public int a = 100;
} /// <summary>
/// Program: used to execute the method.
/// Contains Main method.
/// </summary>
public class Program
{
private static void Main(string[] args)
{
ClassB classB = new ClassB();
ClassA classA = new ClassA();
classA = classB;
classB = classA;
}
}
这个例子会出现错误:无法将类型“ConsoleApplication3.ClassB”隐式转换为“ConsoleApplication3.ClassA”。存在一个显式转换(是否缺少强制转换?)
知识点:我们可以把一个派生类对象赋值给基类,但反过来不行。既(基类对象=派生类对象,可以;派生类对象=基类对象,不行)
总结:本文主要讲了继承的基本概念。
- 我们可以在派生类中声明已经在基类中声明的同名函数。
- 派生类对象调用方法时,基类总是优先执行。
- 保留的关键字“base”可以在派生类中用于调用基类方法。
- 继承不能向后兼容。
- 除了构造函数和析构函数,一个类可以从其基类继承一切。
- 在 C# 中的继承,自定义类不能派生自特殊建在 C# 之类的命令、 System.Enum、 System.Delegate、 System.Array 等。
- 父类只可以有一个。C# 不支持多重继承通过类。
- 在 C# 中的继承中不允许循环依赖项。
- 我们可以将派生类对象赋值给基类,而不是相反。
- 我们不能将 int 隐式转换为char,但char可以转换为 int。
注明:原文地址:https://codeteddy.com/2014/05/16/diving-in-oop-part-2-polymorphism-and-inheritance-inheritance/我只是在作者基础上进行了翻译和总结,并加了一点自己的理解。希望对大家有帮助。如有错误敬请指正。
C#面向对象(OOP)入门—第二天—多态和继承(继承)的更多相关文章
- C#面向对象(OOP)入门—第一天—多态和继承(方法重载)
面向对象是什么 面向对象是一种基于对象的编程方法,它取代了仅仅依靠方法和流程的编程方式.面向对象的编程语言中,对象(object)其实就是指特定类型.或某个类的实例.面向对象使得编程人员更容易组织和管 ...
- Java入门 第二季第三章 继承
这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承 ★ 概念:继承是类与类的一种关系,是一种 "is ...
- PHP面向对象(OOP)编程入门教程链接
PHP官方学习OOP: http://php.net/manual/zh/oop5.intro.php 从其他博主学习:(以下链接来源: http://blog.snsgou.com/post-41. ...
- php面向对象(OOP)编程完全教程
摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...
- 【PHP面向对象(OOP)编程入门教程】21.多态的应用
多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多 态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存 ...
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
- 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- JAVA入门第二季(mooc-笔记)
相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...
- OO的奇妙冒险——OOP入门与字符串处理
OO的奇妙冒险 ~OOP入门与字符串处理~ 总体分析 公测 中测(基础与进阶): 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响.中测的样 ...
随机推荐
- redux样板代码简化写法
直接使用redux,要写很多样板代码,大量的actiontype,actionCreator.一个异步的方法要写三个actiontype,三个actionCreator,十分繁琐.下面是本人使用的一种 ...
- eclipse ide for java ee developers 开发环境搭建(J2EE) 【转载】
使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指导,专门讲解了一下Eclipse开发环境的搭建过程, 一是帮助他们尽快的熟悉IDE的使用,二也是保证团队 ...
- UIViewContentMode的各种效果
UIViewContentMode的各种效果: 首先它是枚举类型的数据,表示为下所示: typedef enum { UIViewContentModeScaleToFill, ...
- Codeforces Round #546 (Div. 2) 题解
Codeforces Round #546 (Div. 2) 题目链接:https://codeforces.com/contest/1136 A. Nastya Is Reading a Book ...
- js随机数生成与排序
'use strict'; // 排序算法. // 生成一个指定数量的不含重复数字的随机数组 function ranArr(n,callback) { var res = []; var tmp ; ...
- [Luogu 1160] 队列安排
Luogu 1160 队列安排 链表H2O H2O H2O模板. 太久不写链表,忘干净了,竟调了半个晚上. 保留备用. #include <cstdio> #include <cst ...
- 【Dream Counting, 2006 Dec-数数的梦】数位dp
题意:给定两个数,问区间[A,B]中0~9分别出现了多少次.A,B<=10^18 题解:应该是最裸的数位dp吧..一开始没有记忆化tle了TAT 我们可以求出区间[0,B]的,再减去区间[0,A ...
- 「6月雅礼集训 2017 Day4」寻找天哥
[题目大意] 给出$n$个三维向量,设当前向量长度为$L$,每次沿着向量等概率走$[0,L]$个长度.一个球每秒半径增加1个长度,直到覆盖位置,每秒耗能为球体积,求总耗能的期望. 设最后半径为R,那么 ...
- 【BZOJ】2054: 疯狂的馒头
[题意]给定n个元素,m次给一段区间染色为i,求最终颜色. [算法]并查集 [题解]因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点. 细节: 1.fa[n+1 ...
- 【CODEVS】1281 Xn数列
[算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1 c 0 c 0 防止溢出可以用类似快速幂的快速乘. ...