继承是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章 面向对象编程简介相关推荐

  1. 8.2.3多态性 第8章 面向对象编程简介

    继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,   [从同一个基类派生出来的多个子类在方法和属性上有重叠] 因此,可以使用相同的语法处理从同一个基类实例化的对象. 例如,如果基类Anima ...

  2. 第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 静态类 ...

  3. 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类

    非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...

  4. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  5. JavaSE:第5章 面向对象编程(中)

    文章目录 JavaSE:第5章 面向对象编程(中) 5.1 OOP特征二:继承性 5.2 方法的重写(override) 5.3 四种访问权限修饰符 5.4 关键字:super 5.5 子类对象实例化 ...

  6. 《PHP精粹:编写高效PHP代码》——第1章面向对象编程

    本节书摘来自华章社区<PHP精粹:编写高效PHP代码>一书中的第1章面向对象编程,作者:(美) Davey Shafik,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  7. Matlab AppDesigner编程教程第1章——面向对象编程

    Matlab AppDesigner编程教程第1章--面向对象编程 文章目录 Matlab AppDesigner编程教程第1章--面向对象编程 前言 一.什么是面向对象编程 二.使用步骤 1.新建类 ...

  8. 《Kotin 极简教程》第7章 面向对象编程(OOP)(1)

    第7章 面向对象编程(OOP) 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程 http:/ ...

  9. ruby 新建对象_Ruby面向对象编程简介

    ruby 新建对象 by Nishant Mishra 由Nishant Mishra Ruby面向对象编程简介 (An Introduction to Object-Oriented Program ...

最新文章

  1. Python爬虫(十三)_JSON模块与JsonPath
  2. 农信互联X联网副总冯兴臣:关于互农产品的一些思考
  3. Python3.5 报错:NameError: name 'reload' is not defined
  4. VTK:字形2D用法实战
  5. Linux路由界面设置,nuxt中如何配置页面路由
  6. 转:验证curl_init() 返回 false时..
  7. 集成学习—随机森林原理(理解与论文研读)
  8. flume拦截器及自定义拦截器
  9. 用云来实现主机效率的最大化 CSC这家公司是怎么做的?
  10. Caesar解密-number theroy
  11. 了解KVM切换器的四种类形
  12. uniapp链接生成二维码
  13. 喜欢上Cinnamon的10个理由
  14. C#实现批量生成条形码 ——主要用于准考证号的条形码生成
  15. 游戏原画师需要学什么软件?动漫绘画软件推荐
  16. mysql备份数据库某表格_MySQL备份:使用自动轮换表格备份,轻松恢复部分/完整数据库...
  17. layui 表格合计
  18. 计算机四级嵌入式知识点——《计算机组成与接口》
  19. PilotEdit v9.7
  20. 游戏开发 入职6个月 牢骚型小结

热门文章

  1. swiper轮播器的常用案例分析(swiper hover停止mouseover停止)
  2. 应该怎么做一个登录功能?
  3. android studio 导入一个已有的android studio project作为lib使用
  4. Arcgis for Javascript实现两个地图的联动
  5. apache日志信息详解
  6. linux lnmp1.5 部署laravel项目
  7. JAVA学习day07
  8. 能拯救你的人也只能是自己
  9. 快速建立自己的个人网站!五款建站程序
  10. I/O通信模型(BIO,NIO,AIO)