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章中将详细介绍这个类。

注意:如本章前面所述,接口也可以继承自其他接口。与类不同的是,接口可以继承多个基接口(以类可以支持多个接口的方式派生)

时间: 2024-10-14 00:41:22

8.2.2继承 第8章 面向对象编程简介的相关文章

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

继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,   [从同一个基类派生出来的多个子类在方法和属性上有重叠] 因此,可以使用相同的语法处理从同一个基类实例化的对象. 例如,如果基类Animal有一个方法EatFood(),则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的: Cow myCow=new Cow(); myCow.EatFood(); Chicken myChicken=new Chicken(); myChicken.EatFood(); 多态则更推进

OC基础-面向对象编程简介

OC语言特点: C语言的超集,可与C,C+混编,具有良好的兼容性. 具备完善的面向对象特征. 包含一个运行时系统. 类库丰富. 面向对象编程(OOP:Object Oriented Programming)简介: 常用语言:java,C#,C++ 特征:对象,类,封装,继承,多态 面向过程与面向对象区别: 前者以过程为中心实现函数,依次调用,以过程为中心. 分解问题组成的对象,协调对象间相互通信.以对象为中心. OC中类的定义: 使用对象完成程序. 先定义类,在创建对象,然后使用对象. 接口部分

Python面向对象编程——简介

Python面向对象编程--简介 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 . 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向

C++primer第十五章. 面向对象编程

面向对象编程基于三个基本概念:数据抽象.继承和动态绑定. 15.1. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism). 之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”.正如我们将看到的,在 C++ 中,多态性仅用于通过继承而相关联的类型的引用或指针. 继承 派生类(derived class)能够继承基类(baseclass)定义的成员,派生类可以无须改变而使用那些与派生类型具体特性不相关的操作,派生类可以

第六章-面向对象编程

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行, 面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度 面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递. 在Python中, 所有数据类型都可以视为对象, 同时也可以自定义对象. 自定

Delphi 高手突破(申 旻 著)-第 2 章 面向对象编程理论基础

面向对象是一种思维方式(理念),是一种方法论. 每个软件开发人员都会经常听到. 看到“ 面向对象” 这个词,程序员们也时常会把它挂在嘴上.那么, 什么是面向对象?什么是面向对象编程?是不是写几个类就算面向对象了?为什么要面向对象?因为别人都用,所以我也要用?显然, 并不是在程序中写了几个类就算面向对象编程了, 用面向对象编程也并不是为了赶时髦. “结构化编程” ( SP) 是一种编程方法, 是用计算机的视角来抽象问题的方法. 而“ 面向对象编程” ( OOP)也是一种编程方法, 它从更接近真实世

第四章-面向对象编程

1 面向对象 一般地, 类是对象的类型模板, 实例是根据类创建的对象 但是在JavaScript中不区分类和实例, 而是通过原型(prototype)来实现面向对象编程 使用原型相当于继承 但是如果再给xiaoming绑定一个_proto_, 那原来绑定的东西就没有了 2 创建对象 对象访问属性的过程: 在当前对象查找, 没有找到就找它原型对象有没有, 再没有就找object的原型上查找, 如果都没查找到, 就返回undefined xiaoming -> xiaoming._proto_ ->

第三章面向对象编程思想

""" 编码规范: 类名首字母应以大写字母开头 类的成员/属性: 成员属性 实例化对象的属性: self.name=name 可以被访问,也可以在类的外部被修改 私有属性 实例化对象的私有属性: self.__age=age 属性名前加两下划线 外部无法被访问, 也不能被修改,只能内部访问和修改 想要在外部访问只能自定义一个方法了 强制访问 私有属性: p._People__age 对象名._类名__私有属性 公共属性: 类的属性,也叫静态属性,他是在类的内部定义的 clas

第五章 面向对象编程设计与开发——续3

5.9--封装 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅是一种变形操作 #类中所有双下划线开头的名称如_x都会自动形成:_类名_x的形式: class A: _N=0#类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如_N,会变形为_A_N def _init_(self): self._x=10#变形为self._A_X def _foo(self):#变形为_A_foo print('form A') def bar(s