什么是继承

定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。被继承的类B称为父类基类,继承了父类的类A称为子类派生类

继承的优点

1. 减少代码冗余

2. 提供代码重用

3. 减少代码量以及提高代码可读性

4. 代码易于管理以及可划分父类和子类

5. 通过子类重写父类的功能可支持代码扩展

继承的缺点

1. 父类变,子类不得不变,继承会破坏包装。父类实现细节暴露给子类,其实是增大了两个类之间的耦合性

2. 在继承结构中,很多数据成员仍然没有被使用,分配给他们的内存没有被利用;因此,如果你没有正确地使用继承,将影响程序性能

继承的特点

1. 密封seald 类和密封方法不能被继承,静态类和普通类的静态成员也不能被继承

2. 派生类除了继承父类的特性外,还可以有自己独有特性

3. 子类不能拥有父类的私有成员

4. 子类可以以自己的方式实现父类的功能(即方法重写)

实现继承

如果要声明派生自另一个类的一个类,就可以使用下面的语法 :

class MyDerivedClass: MyBaseClass
{
  // functions and data members here
}

如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口 :

public class MyDerivedClass: MyBaseC1ass, IInterface1, IInterface2
{
// etc.
}

对于结构,语法如下 :

public struct MyDerivedstruct: IInterface1, IInterface2
{
// etc.
}

如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。因此下面的两段代码 生成相同的结果 :

class MyClass: object  // derives from System.Object
{
// etc.
)

class MyClass // derives from System.Object
(
// etc.
)

第二种形式比较常用,因为它较简单。 C#支持object关键字,它用作System.Object类的假名,所以也可以编写下面的代码 :

class MyClass:Object  // derives from System.Object
(
// etc.
)

多重继承

多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。与单一继承相对,单一继承指一个类别只可以继承自一个父类。

C# 不支持多重继承。但是,可以使用接口来实现多重继承。下面的程序演示了这点:

using System;
namespace InheritanceApplication
{
class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
} // 基类 PaintCost
public interface PaintCost
{
int getCost(int area); }
// 派生类
class Rectangle : Shape, PaintCost
{
public int getArea()
{
return (width * height);
}
public int getCost(int area)
{
return area * ;
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle Rect = new Rectangle();
int area;
Rect.setWidth();
Rect.setHeight();
area = Rect.getArea();
// 打印对象的面积
Console.WriteLine("总面积: {0}", Rect.getArea());
Console.WriteLine("油漆总成本: ${0}" , Rect.getCost(area));
Console.ReadKey();
}
}
}

当上面的代码被编译和执行时,它会产生下列结果:

要点:

1. 子类不仅继承了父类的公有成员,同时继承了父类的私有成员,只是父类的私有成员在子类中不可被访问;

2. C#只允许单继承,一个类只能继承于一个父类;

3. 被“sealed”关键字修饰的类将不能被继承;

4. 被“protected”修饰的成员或者数据可以直接被派生类访问,属于“可以在家族里分享的秘密”。

5. 善用“base”关键字,显示调用合适的自定义基类构造函数而不是使用默认构造函数。

6. 继承需要合理使用才能发挥最佳效果,一般情况下适用于“is a”关系,不适用“has a”关系。

7. System.Object是所有类型的基类

8. C#中继承的写法,class A:B{ }

9. 继承具有传递性,由A:B B:C=>A:C

10. 构造方法不能继承

C#面向对象三大特性:继承的更多相关文章

  1. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  2. python学习-64 面向对象三大特性----继承1

    面向对象三大特性 1.三大特性? 继承,多态,封装 2.什么是继承? 类的继承和现实生活中的父与子,继承关系是一样的,父类为基类. python中的类继承分为:单继承和多继承 3.举例说明 class ...

  3. Python入门-面向对象三大特性-继承

    面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容. 例如: 猫可以:喵喵叫.吃.喝.拉.撒 狗可以:汪汪叫.吃.喝.拉.撒 如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实 ...

  4. python之面向对象三大特性: 继承(单继承)

    什么是继承 专业角度: B 继承 A类, B就叫做A的子类,派生类, A叫做B的父类,基类,超类. B类以及B类的对象使用A类的所有的属性以及方法. 字面意思: 继承就是继承父母所有的资产 class ...

  5. Python()- 面向对象三大特性----继承

    继承: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类(基类或超类),新建的类是所继承的类的(派生类或子类) 人类和狗 有相同的属性, 提取了一个__init__方法,在这 ...

  6. C++面向对象三大特性

    面向对象三大特性 继承 public protected private public继承 public protected 不可见 private继承 private private 不可见 pro ...

  7. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  8. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  9. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  10. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

随机推荐

  1. testclass面试题

    http://www.testclass.net/interview/selenium/   seleniuim面试题 http://www.testclass.net/interview/inter ...

  2. 怎么把apk文件部署在云服务器上

    你服务器直接使用nginx,将请求映射到固定目录,把你的apk放到该目录.其他都不用干了.

  3. Codeforces Round #603 (Div. 2) C.Everyone is A Winner!

    tag里有二分,非常的神奇,我用暴力做的,等下去看看二分的题解 但是那个数组的大小是我瞎开的,但是居然没有问题233 #include <cstdio> #include <cmat ...

  4. Jquery change方法

    jQuery 事件 - change() 方法 当输入域发生变化时改变其颜色: $(".field").change(function(){ $(this).css("b ...

  5. [Luogu]中位数

    Description Luogu1168 Solution 一种神奇的做法:开一个大根堆和小根堆,保证大根堆比小根堆多1个元素,且大根堆堆顶元素比小根堆堆顶元素小,那么大根堆堆顶就是中位数.插入的时 ...

  6. codeforces 1282 E. The Cake Is a Lie (dfs+构造)

    链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...

  7. [转] UML中的六大关系

    UML中的六大关系 转自:https://www.cnblogs.com/hoojo/p/uml_design.html 在UML类图中,常见的有以下几种关系: 泛化(Generalization), ...

  8. 使用鼠标左键事件实现VR中的Eye Gaze Input

    1.光标以及光标动画的显示 using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  9. spring自动装配和通过java实现装配

    1.组建扫描 在类上添加注解@Component注解可以实现组建扫描 @Component public class A{ ... } 2.自动装配 通过在属性上或者方法上添加@Autowired注解 ...

  10. rancher2中文文档地址

    rancher2中文文档地址 待办 https://docs.rancher.cn/