什么是继承

定义:继承是面向对象编程语言中的一个重要特性,当一个类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. rest_framework:解析器

    一.解析器的作用 根据请求头content-type选择对应的解析器对请求体内容进行处理. 有application/json,x-www-form-urlencoded,form-data等格式 二 ...

  2. NVMe over Fabrics 协议Discovery服务交互过程跟踪

    Discovery服务过程跟踪 对于NVMe over Fabrics的subsystem,有两种类型:Discovery子系统和NVM子系统.这里介绍与Discovery子系统相关的交互内容(即:在 ...

  3. 本地连接服务器的redis,jedisCluster创建问题

    1.redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 查看 ...

  4. Illegal target for the requested operation

    org.tigris.subversion.javahl.ClientException: Illegal target for the requested operation svn: Commit ...

  5. element 表格里的input点击回车聚焦下个input

    <template> <card> <el-table ref="singleTable" :data="tableData" h ...

  6. Jquery动态改变my97datepicker的日期形式

    先要解绑触发事件: $('#start').unbind('focus'); 然后再绑定触发事件: $('#start').bind('focus',function(){WdatePicker({s ...

  7. array.find()方法

    //array.find(function(currentValue, index, arr),thisValue) 方法说明 let tempArray = [ {"key":1 ...

  8. linux软件下载

    可以到linux官网下载:http://vault.centos.org/6.10/os/Source/SPackages/

  9. 使用c#做前台页面

    1.有很多组件,组件右属性,事件 2.在table中,操作用的是图片 3.打开dialog时,其他窗体不能使用 4.在子窗体编辑完,对后台操作后,在父窗体加载一下数据

  10. mybatis报错:A query was run and no Result Maps were found for the Mapped Statement、、Property [login_ip] not found on type [com.thinkgem.jeesite.common.permission.entity.PremissUser]问题解决

    今天在做ssm项目的时候出现了: 先是出现 了错误: mybatis报错:A query was run and no Result Maps were found for the Mapped St ...