一、C#继承简介

1. 类的层次结构

下面是一个类的层次结构图:

上图反映了鱼类的派生关系,其中最高层的实体往往具有最一般最普遍的特征,越下层的实体就越具体,并且下层包含了上层的特征。如果将上层的实体比作基类,那么下层的实体就可以比作派生类,而基类也可以称为派生类的父类。

继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特征或者修改已有的基类的特性,以建立起类的新层次。

在C#中,继承是指能够从它的父类中继承除构造函数以外的所有数据的定义和功能。除构造函数和析构函数以外,派生类隐式地继承了直接基类的所有成员,其中就包括继承“方法、域、属性、事件和索引指示器”等成员。

2. 类的继承方式

类的继承方式为:在声明类时,在类名称后面加上冒号,在冒号后面指定要从中继承的类(基类)。

例如:

public class Vehicle // 定义汽车类,这是基类
{
    public Vehicle(){}
}
public class Car : Vehicle  // 定义轿车类,从汽车类中继承。这是派生类
{
    public Car(){}
}

在上例中,派生类(新类)将获取基类的所有非私有数据和行为以及新类为自己定义的所有其它数据或行为。因此,新类具有两个有效类型:新类的类型和它继承的类的类型。

二、C#继承规则

1. C#中类的继承规则

C#中类的继承规则如下:

?继承是能够传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同时也继承了A中的成员。注意:Object类是所有类的基类。

?派生类应该是对基类的扩展。派生类可以添加新的成员,但是不能移除已经继承的成员的定义。

?构造函数和析构函数不能被继承。除此之外的其它成员,都能被继承。基类中成员的访问方式只能决定派生类是否能访问它们。

?派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。此时,派生类不能访问被覆盖的成员,不过,使用new修饰符可以声明具有相同名称或签名的新成员。

?类可以使用virtual修饰符定义虚方法、虚属性和虚索引指示器,它的派生类能够使用override修饰符来重载这些成员。

?派生类只能从一个类中继承,可以通过接口实现多重继承。

2. 示例
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        public class A             // 基类
        {
            protected string name; // 受保护字段成员,可在当前类和派生类中访问
            protected int age;     // 受保护字段成员
            public A(string name, int age) // 实例构造函数
            {
                this.name = name;
                this.age = age;
            }
            public void ShowA()// 公共方法
            {
                Console.WriteLine("name:{0} age:{1}",name,age);
            }
        }
        public class B : A            // 这是派生类,以A作为基类
        {
            private int ID;           // 派生类的成员
            public B(int ID, string name, int age)
                : base(name, age)     // 调用直接基类的实例构造函数
            {
                this.ID = ID;
            }
            public void ShowB()       // 公共方法
            {
                Console.WriteLine("ID:{0}", ID);
            }
        }
        static void Main(string[] args)
        {
            // C#继承规则-www.baike369.com
            B b = new B(100,"BaiXue",18);// 创建类的实例
            b.ShowA();                   // 调用基类的方法
            b.ShowB();                   // 调用自身类的方法
            Console.ReadLine();
        }
    }
}

运行结果:
 
name:BaiXue age:18
ID:100

C#继承简介与规则的更多相关文章

  1. "MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "解决方法

    写Code First 时(使用的是MySql数据库),添加好EntityFrame.MySql.Data .MySql.Data.Entity后 ,写好TestDbContext类. 运行时报出一个 ...

  2. C#继承机制 C#中的继承符合下列规则

    1.继承是可传递的.如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员.Object 类作为所有类的基类. 2.派生类应当是对基类的扩展.派生类可以添加新的成员, ...

  3. python继承简介

    继承 是面向对象的三大特性之一 作用: 通过继承可以使一个类获取其它类中的属性和方法 使用方法: 在定义类时,可以在类名后的括号中指定当前类的父类(超类.基类.super) 这样子类(衍生类)就可以直 ...

  4. 干货:python面对对象类继承简介

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:python视觉算法 PS:如有需要Python学习资料的小伙伴可以加 ...

  5. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern

    LHS简介 在规则文件组成章节,我们已经了解了LHS的基本使用说明.LHS是规则条件部分的统称,由0个或多个条件元素组成.前面我们已经提到,如果没有条件元素那么默认就是true. 没有条件元素,官方示 ...

  6. 《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern

    LHS简介 在规则文件组成章节,我们已经了解了LHS的基本使用说明.LHS是规则条件部分的统称,由0个或多个条件元素组成.前面我们已经提到,如果没有条件元素那么默认就是true. 没有条件元素,官方示 ...

  7. Eslint 配置及规则说明(报错)

    https://blog.csdn.net/violetjack0808/article/details/72620859 https://blog.csdn.net/hsl0530hsl/artic ...

  8. CSS选择器的权重与优先规则?

    我们做项目的时候,经常遇到样式层叠问题,被其他的样式覆盖,或者写的权重不高没效果,对权重没有具体的分析,做了一个总结. css继承是从一个元素向其后代元素传递属性值所采用的机制.确定应当向一个元素应用 ...

  9. 学习Sass 的基本语法规则[Sass和compass学习笔记]

    自从发现可编程的css语法 Sass和基于Sass的css库compass 一个给我的感觉像c# 另外一个给我的感觉像.NET Framework,一切都为了提升开发效率和降低开发大型web的门槛. ...

随机推荐

  1. redis初步学习 0

    2.1 Redis是什么 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis提供了一些丰富的数据 ...

  2. Java 读写Properties配置文件【转】

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地 ...

  3. 提高Service提高进程优先级别,不被系统容易杀死

    1.首先要了解lowmemroykiller机制  在Android的lowmemroykiller机制中,会对于所有进程进行分类,对于每一类别的进程会有其oom_adj值的取值范围,oom_adj值 ...

  4. ace+validate表单验证(两种方法)

    //修改密码(直接在validate中验证提交) $("#changePassword").on(ace.click_event, function() { var html = ...

  5. maya2018安装失败如何卸载重装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  6. script脚本中写不写$(document).ready(function() {});的区别

    $(document).ready() 里的代码是在页面内容都加载完才执行的,如果把代码直接写到script标签里,当页面加载完这个script标签就会执行里边的代码了,此时如果你标签里执行的代码调用 ...

  7. [转]c#匿名类

    首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...

  8. SpringBoot系列之——整合JPA、mysql

    一.JPA      1. 概念:JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 2. ...

  9. wamp环境初步使用

    在wamp的www目录下部署页面,localhost/目录/index.html

  10. JS条件语句优化

    1.对多个条件使用Array.includes eg: function test(fruit){                                                    ...