zoukankan      html  css  js  c++  java
  • (原创)c#学习笔记08--面向对象编程简介02--OOP技术02--继承

    8.2.2  继承

      承是 OOP 最重要的特性之一。任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员。在OOP 中,被继承(也称为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类

      继承性可以从一个较一般的基类扩展或创建更多的特定类。例如,考虑一个代表农场家禽的类(80 多岁的一流开发人员 Old MacDonald 在他的家禽应用程序中使用)。这个类叫作 Animal,拥有EatFood()或Breed()等方法, 我们可以创建一个派生类Cow, 支持所有这些方法,它也有自己的方法,如Moo()和SupplyMilk()。还可以创建另一个派生类Chicken,该类有Cluck()和LayEgg()方法。

      在UML中,用箭头表示继承,如图8-7所示。

      note: 为了简洁起见,图8-7中省略了成员的返回类型。

      在继承一个基类时,成员的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。这就是说,只使用这两个可访问性,不能让一个成员可由基类和派生类访问,而不能由外部的代码访问。

      为了解决这个问题,C#提供了第三种可访问性:protected,只有派生类才能访问protected成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。

      除了定义成员的保护级别外,我们还可以为成员定义其继承行为。基类的成员可以是虚拟的,也就是说,成员可以由继承它的类重写。派生类可以提供成员的其他实现代码。这种实现代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们如果没有提供其他实现方式,通过派生类使用成员的外部代码就自动访问基类中成员的实现代码

      note: 虚拟成员不能是私有成员,因为这样会自相矛盾——不能说成员可以由派生类重写,同时派生类又不能访问它。

      在前面的家畜示例中,可以把EatFood()变成虚拟成员,在派生类中为它提供新的实现代码,例如为Cow类提供新实现代码,如图8-8所示。这里显示了Animal和Cow类的EatFood()方法,说明它们有自己的实现代码。

      基类还可以定义为抽象类。抽象类不能直接实例化。要使用抽象类,必须继承这个类,抽象类可以有抽象成员,这些成员在基类中没有实现代码,这些实现代码必须在派生类中提供。如果Animal是一个抽象类,UML就会如图8-9所示。

      note: 抽象类名以斜体显示(有时它们的方框有一个短横线)。

      在图8-9 中,EatFood()和Breed()都显示在派生类Chicken 和Cow 中,这说明这些方法是抽象的(必须在派生类中重写)或者虚拟的(己经在 Chicken 和 Cow 中重写)。当然,抽象基类可以提供成员的实现代码,这是很常见的。不能实例化抽象类,并不意味着不能在抽象类中封装功能。

      最后,类可以是密封(seal)的。密封的类不能用作基类,所以没有派生类。

      在C#中,所有的对象都由一个共同的基类object(在.NET Framework中,它是System.Object类的别名)。第9章将详细介细这个类。

      note: 接口也可以继承自其他接口。与类不同的是,接口可以继承多个基接口(与类可以支持多个接口的方式类似,但类只能派生于一个基类。)。

      

  • 相关阅读:
    leetcode 第二题Add Two Numbers java
    二叉树中的那些常见的面试题(转)
    运行的指令
    Python常见经典 python中if __name__ == '__main__': 的解析
    软件测试基本概念
    JAVA Android王牌教程
    17个新手常见Python运行时错误
    QTP
    链表有关的常见面试题
    Robot Framework and Ride
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4930675.html
Copyright © 2011-2022 走看看