zoukankan      html  css  js  c++  java
  • C#之继承

    本文意在巩固基础知识,并不是对其进行深入剖析,如若对各位高手没有什么作用,请绕过。
    本文为原创文,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢。
    继承、封装和多态是面向对象编程的重要特性。
    其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
    派生类隐式获得基类的除构造函数和析构函数以外的所有成员。
    派生类只能有一个直接基类,所以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关键字调用基类中的构造函数来传送参数。
    我们可以从代码中看到在创建派生类的对象后,程序首先运行的是基类的构造函数中的内容,然后才是派生类中的内容。
    如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,
    并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。
    

      转自:http://www.cnblogs.com/jiajiayuan/archive/2011/09/09/2172292.html

  • 相关阅读:
    Wijmo 更优美的jQuery UI部件集:在对Wijmo GridView进行排序或者过滤时保留选择
    Wijmo 更优美的jQuery UI部件集:活动日历控件(Event Calendar)
    Wijmo 更优美的jQuery UI部件集:导出Wijmo的GridView到Excel
    Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法
    Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件
    Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)
    Wijmo 更优美的jQuery UI部件集:C1 Wijmo Grids 更多惊喜
    Hello Metro:Windows 8下首个App
    Wijmo 更优美的jQuery UI部件集:运行时处理Wijmo GridView数据操作
    Wijmo 更优美的jQuery UI部件集:自定义 C1WijMenu
  • 原文地址:https://www.cnblogs.com/newsouls/p/2998106.html
Copyright © 2011-2022 走看看