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入门与字符串处理~ 总体分析 公测 中测(基础与进阶): 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响.中测的样 ...
随机推荐
- 51NOD 1773:A国的贸易——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...
- 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
[BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...
- Consul 入门
1. 什么是Consul? Consul 有很多组件,对于整体来说,它是一个服务发现和服务配置的工具,它提供了一下特性: 服务发现 健康检查 KV存储 多数据中心 2.安装Consul 以下是在 Ce ...
- Codeforces Round #402 (Div. 2) A B C sort D二分 (水)
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...
- POJ 2391 二分+最大流
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19066 Accepted: 4 ...
- Qt -------- 容器类
QVector(数组).QLinkedList(链表).QMap(映射表).QHash(哈希表).QQueue(队列) QHash遍历举例: 法1: QThread& ThreadHandle ...
- mybatis 热部署xml文件(spring boot和springmvc两种方式)
参考:http://thinkgem.iteye.com/blog/2304557 步骤:1.创建两个java类 (1)MapperRefresh.java :用于刷新mapper (2)SqlS ...
- 51Nod 1067 Bash游戏 V2 | 博弈论 Bash
n的数据范围非常大,所以不能用标准SG函数 找规律 #include "iostream" #include "cstdio" using namespace ...
- 图论:Prufer编码
BZOJ1211:使用prufer编码解决限定结点度数的树的计数问题 首先学习一下prufer编码是干什么用的 prufer编码可以与无根树形成一一对应的关系 一种无根树就对应了一种prufer编码 ...
- java 8新特性 instant
Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR310规范).在本系列文章中,将对这些新的API进行举例说明. ...