本文意在巩固基础知识,并不是对其进行深入剖析,如若对各位高手没有什么作用,请绕过。
本文为原创文,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢。
继承、封装和多态是面向对象编程的重要特性。
其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。

派生类隐式获得基类的除构造函数和析构函数以外的所有成员。

派生类只能有一个直接基类,所以C#并不支持多重继承,但一个基类可以有多个直接派生类。
继承是可以传递的。
即:

如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。

 class A
    {
        public void Sum(int i,int j)
        {
            int sum = i + j;
            Console.WriteLine("I am A ,my sum ={0}",sum);
        }
    }
    class B : A
    {
        public void Minus(int i,int j)
        {
            int minus = i - j;
            Console.WriteLine("I am B ,my minus ={0}", minus);             this.Sum(3, 4);         }     }
    class InheritanceTest1
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.Minus(3, 4);
            Console.Read();
        }
    }
结果:I am B ,my minus=-1 
     I am A ,my sum = 7

试想一下,当基类Sum()方法是私有时,派生类还会继承该方法吗?
经过本人测试,没有在B类找到该方法,那么是不是它就没有被继承呢?其实不是的,私有成员其实已经被继承了,
但是它们却不可以被访问,因为私有成员只能被声明它们的类或结构体中才可访问,所以看上去像是没有被继承。

如果我们想降低访问基本,我们可以把基类Sum()方法定义为protected。
能够阻止某个类被其他类继承吗?
答案是可以的,C#提供了一个sealed 修饰符,此修饰符会阻止其他类从该类继承。


    sealed class A
    {
        int test;
        public void Sum(int i,int j)
        {
            int sum = i + j;
            Console.WriteLine("I am A ,my sum ={0}",sum);
        }
    }
    class B : A 
    {
        public void Minus(int i,int j)
        {
            int minus = i - j;
            Console.WriteLine("I am B ,my minus ={0}", minus);
            this.Sum(3, 4);       //编译器会报错     
        }
     }

前面说过,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。
 那么我们该如何获得基类的构造函数和自身的构造函数呢?
 我们知道基类的初始化工作由基类的构造函数完成,派生类的初始化工作则有派生类的构造函数完成,
但是这样就产生了派生类构造函数的执行顺序问题。
当基类没有构造函数,派生类也没有构造函数时,派生类新曾成员的初始化工作由其他公有函数来完成。


 public  class A
    {
        int test=0;
        public void sum()
        {
            test++;
            Console.WriteLine("I am test ={0}" ,test);
        }
    }
    class B : A 
    {
        int i;
        public void PrintInt()
        {
            i = 3;
            Console.WriteLine("I am i ={0}", i);
        }
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.PrintInt();
            Console.Read();
        }
    }
结果:I am i=3 
如果只有派生类定义构造函数时,只需构造派生类对象即可。对象的基类部分使用默认构造函数来自动创建。
当基类和派生类都定义有构造函数时,那么执行顺序会怎样呢?

如果基类中是没有参数的构造函数
如果基类中是没有参数的构造函数,在派生类中可以自定义有参数的构造函数

public  class A
    {
        int test=0;
        public A()
        {
            test = 5;
            Console.WriteLine("I am A 公有默认构造函数 ,test={0}", test);
        }
    }
    class B : A 
    {
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B();
            Console.Read();
        }
    }
结果:I am A 公有默认构造函数 ,test=5

由此可以看见,基类的构造函数被执行,在派生类中被调用。
如果基类定义了带有参数的构造函数,那么此构造函数必须被执行,且在派生类中实现该构造函数,此时我们可以使用base关键字


    class A
    {
        int test=0;
        public A(int i)
        {
            test = i;
            Console.WriteLine("I am A 公有有参构造函数 ,test={0}", test);
        }
    }
    class B : A 
    {
        public B(int j):base(j)
        {
            Console.WriteLine("I am B 公有有参构造函数,j={0}",j);
        }
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B(1);
            Console.Read();
        }
    }
结果:I am A 公有有参构造函数 ,test=1     
     I am B 公有有参构造函数,j=1
 

由此可见: 派生类隐式执行基类中带有参数的构造函数,在程序中基类定义了带有参数的构造函数,
在其派生类中被继承,并使用base关键字调用基类中的构造函数来传送参数。

我们可以从代码中看到在创建派生类的对象后,程序首先运行的是基类的构造函数中的内容,然后才是派生类中的内容。
如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,
并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。

c# 继承小结的更多相关文章

  1. Js继承小结

    Js继承小结 一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.n ...

  2. 老生常谈--Js继承小结

    一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.net/stoy ...

  3. javascript的继承小结

    继承是OO语言中最为津津乐道的概念,一般有两种继承方式,接口继承和实现继承,接口继承只继承方法签名,实现继承则是集成真正的方法.由于js中函数没有签名,因此ECMAScript中没有接口继承,只有实现 ...

  4. js的原型继承小结

    考虑:有一个想要复用的对象,并且想要创建的第二个对象需要从第一个对对象中获取其功能. 实现如下: //要继承的对象 var parent = { name:"Papa" }; // ...

  5. [js]js原型链继承小结

    这是之前总结的, 发现有很多的毛病,就是重点不突出,重新翻看的时候还是得耗费很长时间去理解这玩意. js中的继承 js中什么是类 1,类是函数数据类型 2.每个类有一个自带prototype属性 pr ...

  6. java 继承小结

    [code=java] //多态的经典例子 //向上转型后,父类只能调用子类和父类的共同方法和的重写方法(方法名相同,参数也相同),不能调用重载方法(方法名相同,但参数不同) class A { pu ...

  7. javascript --- 继承小结

    回顾之前学到的知识,大体上可以分为两类: 1. 基于构造器工作的模式. 2. 基于对象的工作模式. 3. 是否使用原型 4. 是否执行属性拷贝. 5. 两者都有(执行原型属性拷贝) 下面我们把之前的知 ...

  8. Js对象继承小结

    1.继承 对象的定义好用一些的一般是把实例对象的属性定义在类里面,通过this指针指向具体实例属性.定义对象的public方法时将其绑定到prototype中.子类在继承父类时可以通过对象冒充来继承父 ...

  9. ES5和ES6中对于继承的实现方法

    在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...

随机推荐

  1. java.long中的类和方法

    java.lang.Character.isUpperCase(char ch) 确定指定的字符是否为大写字符. java.lang.Character.toUpperCase()方法用法转换从Uni ...

  2. Android studio中正确引入so文件的方法

    相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式. Android studio中默认使用的是gradle编译方 ...

  3. 【Oracle】使用BBED跳过丢失的归档

    在recover datafile的过程其中假设丢失了须要的归档将使得recover无法进行.使用bbed工具能够跳过丢失的归档进行recover datafile. 实验步骤例如以下: SYS@OR ...

  4. 华为nova3发布,将支持华为AI旅行助手

    ​​​华为nova3于7月18日18:00在深圳大运中心体育馆举行华为nova 3的发布会,从本次华为nova3选择的代言人-易烊千玺,不难看出新机依然延续nova系列的年轻属性,主打 “高颜值 爱自 ...

  5. Spring读书笔记-----Spring核心机制:依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...

  6. oracle中nvl()函数

    oracle中nvl()函数  oracle的nvl函数的使用方法 通过查询获得某个字段的合计值,假设这个值位null将给出一个预设的默认值  select nvl(sum(t.dwxhl),1) f ...

  7. CSS3 - 鼠标移入移出时改变样式

    1,使用伪类实现样式切换伪类是CSS2.1时出现的新特性,让许多原本需要JavaScript才能做出来的效果使用CSS就能实现.比如实现下面的鼠标悬停效果,只要为:hover伪类应用一组新样式即可.当 ...

  8. 在UIWebView中设置cookie

     本文转载至 http://blog.csdn.net/chengyakun11/article/details/8863878 项目中,需要在打开3g网页时,通过cookie传递一些信息. 实现代码 ...

  9. 如何在iOS中使用libxml

    本文转载至 http://blog.csdn.net/cloudhsu/article/details/8087628 1. 选择xcode工程设定 2. 选择target 3. 选择Summary ...

  10. jquery 使用笔记

    一下是在做项目中用到jquery涉及到的一些知识点,把源码复制过来,省得以后忘记了: <link href="<%=request.getContextPath()%>/c ...