8.2.2继承 第8章 面向对象编程简介
继承是OOP最重要的特性之一。 OOP--面向对象
任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员。在OOP中,被继承(继承也称为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以由自己的基类。
继承性可以从一个较一般的基类扩展或创建更多的特定类。例如,考虑一个代表农场家畜的类。这个类叫做Animal,拥有方法如EatFood()或Breed(),我们可以创建一个派生类Cow,支持所有这些方法,它也有自己的方法,如Moo()和SupplyMilk()。还可以创建另外一个派生类Chicken,该类有Cluck()和LayEgg()方法。
在继承一个基类时,成员的可访问性就成了一个重要问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。这就是说,只使用这两个可访问性,不能让一个成员只让基类和派生类访问,而不能由外部代码访问。
为了解决这个问题,C#提供了第三种可访问性protected,只有派生类才可以访问protected成员。对外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。
除了定义成员的保护级别外,我们还可以为成员定义其继承行为。基类的成员可以是virtual的,也就是说,成员可以由继承它的类重写。派生类可以提供成员的其他执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但是外部不能访问它们。如果没有提供其他执行方式,外部代码就可以访问基类中成员的执行代码。
注意:虚拟成员不能是私有成员,因为这样会自相矛盾——不能说成员可以由派生类重写,同时派生类又不能访问它。
在前面的家畜示例中,可以把EatFood变成虚拟成员,在派生类中为它提供新的执行代码,例如为Cow类提供新执行代码,如下图所示。
这里显示了Animal和Cow类的EatFood()方法,说明它们有自己的执行代码。
基类还可以定义为抽象类,抽象类不能直接实例化。要使用抽象类,必须继承这个类,抽象类可以有抽象成员,这些成员在基类中没有指定代码,这些执行代码必须在派生类中提供。
如果Animal是一个抽象类,UML图就会如下图所示
注意:抽象类以斜体名称显示(有时它们的方框是虚线)
上图中EatFood()和Breed()都显示在派生类Chicken和Cow中。
有两种可能:
1.说明这些方法是抽象的(必须在派生类中重写)
abstract class Animal{public abstract void EadFood();//抽象方法,不可以有{}主体public abstract void Breed();}class Cow : Animal{public void Moo() { }public void SupplyMilk() { }public override void EadFood() { }//抽象方法在子类中必须实现public override void Breed() { }}class Chicken : Animal{public void Cluck() { }public void LayEgg() { }public override void EadFood() { }public override void Breed() { }}
2.说明这些方法是虚拟的(已紧在Chicken和Cow中重写)
abstract class Animal{public virtual void EadFood() { }//虚拟方法,必须有{}实体public virtual void Breed() { }} class Cow : Animal{public void Moo() { }public void SupplyMilk() { }public override void EadFood() { }//虚拟方法在子类中可以实现,也可以不实现public override void Breed() { }} class Chicken : Animal{public void Cluck() { }public void LayEgg() { }public override void EadFood() { }public override void Breed() { }}
当然,抽象基类可以提供成员的实现代码,这是很常见的。不能实例化抽象类,意味着不能再抽象类中封装功能。
最后,类可以是密封的sealed。密封的类不能用作基类,所以没有派生类。
在C#中,所有的对象都有一个共同的基类object(在.Net Framework中,其别名是System.Object)。第9章中将详细介绍这个类。
注意:如本章前面所述,接口也可以继承自其他接口。与类不同的是,接口可以继承多个基接口(以类可以支持多个接口的方式派生)
转载于:https://www.cnblogs.com/chucklu/p/4063712.html
8.2.2继承 第8章 面向对象编程简介相关推荐
- 8.2.3多态性 第8章 面向对象编程简介
继承的一个结果是派生于基类的类在方法和属性上有一定的重叠, [从同一个基类派生出来的多个子类在方法和属性上有重叠] 因此,可以使用相同的语法处理从同一个基类实例化的对象. 例如,如果基类Anima ...
- 第7章 面向对象编程(OOP) 《Kotin 编程思想·实战》
第7章 面向对象编程(OOP) 7.1 面向对象思想 7.2 类与继承 7.2.1 类 7.2.1.1 抽象类 7.2.1.2 接口 7.2.1.3 枚举 7.2.1.4 注解 7.2.1.5 静态类 ...
- 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类
非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...
- Java基础学习——第六章 面向对象编程(下)
Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...
- JavaSE:第5章 面向对象编程(中)
文章目录 JavaSE:第5章 面向对象编程(中) 5.1 OOP特征二:继承性 5.2 方法的重写(override) 5.3 四种访问权限修饰符 5.4 关键字:super 5.5 子类对象实例化 ...
- 《PHP精粹:编写高效PHP代码》——第1章面向对象编程
本节书摘来自华章社区<PHP精粹:编写高效PHP代码>一书中的第1章面向对象编程,作者:(美) Davey Shafik,更多章节内容可以访问云栖社区"华章社区"公众号 ...
- Matlab AppDesigner编程教程第1章——面向对象编程
Matlab AppDesigner编程教程第1章--面向对象编程 文章目录 Matlab AppDesigner编程教程第1章--面向对象编程 前言 一.什么是面向对象编程 二.使用步骤 1.新建类 ...
- 《Kotin 极简教程》第7章 面向对象编程(OOP)(1)
第7章 面向对象编程(OOP) 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程 http:/ ...
- ruby 新建对象_Ruby面向对象编程简介
ruby 新建对象 by Nishant Mishra 由Nishant Mishra Ruby面向对象编程简介 (An Introduction to Object-Oriented Program ...
最新文章
- Python爬虫(十三)_JSON模块与JsonPath
- 农信互联X联网副总冯兴臣:关于互农产品的一些思考
- Python3.5 报错:NameError: name 'reload' is not defined
- VTK:字形2D用法实战
- Linux路由界面设置,nuxt中如何配置页面路由
- 转:验证curl_init() 返回 false时..
- 集成学习—随机森林原理(理解与论文研读)
- flume拦截器及自定义拦截器
- 用云来实现主机效率的最大化 CSC这家公司是怎么做的?
- Caesar解密-number theroy
- 了解KVM切换器的四种类形
- uniapp链接生成二维码
- 喜欢上Cinnamon的10个理由
- C#实现批量生成条形码 ——主要用于准考证号的条形码生成
- 游戏原画师需要学什么软件?动漫绘画软件推荐
- mysql备份数据库某表格_MySQL备份:使用自动轮换表格备份,轻松恢复部分/完整数据库...
- layui 表格合计
- 计算机四级嵌入式知识点——《计算机组成与接口》
- PilotEdit v9.7
- 游戏开发 入职6个月 牢骚型小结