• 继承


    一、继承的类型
    1.1 实现继承和接口继承
    C#中既有实现继承,也有接口继承。它们没有强弱之分,因为两种继承都完全内置于语言,因此很容易为不同的情形选择最好的体系结构。
    实现继承:表示一个类型派生于一个基类型,拥有该类型的所有成员字段和函数。
    接口继承:表示一个类型只继承了函数的签名,没有继承任何实现。在需要指定该类型具有某些可用的特征时,最好使用这种类型的继承。接口继承常常被看做提供了一种契约:通过类型派生于接口,从而保证为客户提供某个功能。
    1.2 多重继承
     C#不支持多重实现继承,但允许类型派生于多个接口。所以C#类可以派生于另一个类和任意多个接口。
    1.3 结构和类
    前面说过了结构是值类型,不支持继承,但是每个结构都自动派生于System.ValueType。实际上,不能建立结构的类型层次,但结构可以实现接口。
    二、实现的继承
    类派生于另一个类,语法如下:

    class MyDerivedClass:MyBaseClass
    {
     
    //function and data members here
    }
    C#不支持私有继承,所以基类名上没有public或private限定符。
    类派生于接口,则用都好分隔。
    2.1 虚方法
    在C#中可以把在方法或者属性的前面加上virtual,声明基类的方法为虚方法或者虚属性,虚方法和虚属性的规则相同。语法如下:
    class MyBaseClass
    {
       
    public virtual string VirtualMethod()
       
    {
         
    return "this method is virtual and define in MyBaseClass";
       }

    }
    在C#中,方法在默认的情况下不是虚拟的,但(除构造函数以外)可以显示的声明。派生类重写基类的虚方法时,要使用override关键字显示声明:
    注意:成员字段和静态函数不能被声明为virtual,因为这个概念只对类中的实例函数成员有意义。
    2.2 隐藏方法
    如果在基类和派生类中都声明了签名相同的方法,而基类中的方法又没有声明为virtual,派生类中的方法也没有声明成override,则派生类方法就会隐藏基类方法。结果是调用哪个类的方法取决于引用实例的变量类型,而不是实例本身的类型。
    2.3 调用函数的基本版本
    C#有一种特殊的语法用于从派生类中调用方法的基本版本:base.<MethodName>()。
    2.4 抽象类和抽象函数
    C#中的抽象类要声明为abstract,抽象类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。显然抽象函数也是虚拟的,但不需要提供virtual关键字,而用abstract关键字。如果类包含了抽象函数,那么该类也是抽象的,类必须用abstract声明。
    absttact class Building
    {
      
    public abstract decimal CalculateHeatingCost();//abstract method
    }
    2.5 密封类和密封方法
    C#允许把类和方法声明为sealed,对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。
    sealed class FinalClass
    {
    }
    2.6 派生类的构造函数
    在创建派生类的实例时,实际上会有多个构造函数在起作用。实例化类的构造函数本身不能初始化类,还必须调用基类中的构造函数。即派生类的实例构造是按层次结构进行的,顺序是先执行基类的构造函数,再执行派生类的构造函数。
    基类的构造函数总是最先调用,那么派生类的构造函数可以在执行的过程中调用基类的方法、属性和其他成员,因为基类已经构造出来了,其他字段也初始化了。
    //在结构层次中添加无参数的构造函数
    public abstract class GenericCustomer
    {
      
    private string name;
      
    public GenericCustomer():base()
      
    {
        name 
    = "myName";
      }

    }


    //在结构层次中添加带参数的构造函数
    public class Nevermore60Customer:GenericCustomer
    {
      
    private int highCost;
      
    public Nevermore60Customer(string name):base(name)
      
    {
        
    this.highCost = 0;
      }

    }
    三、修饰符
    C#中完整的修饰符列表:
    修饰符 应用于 说明
    public 所有类型或成员 任何代码均可以访问该方法
    protected 类型和内嵌类型的所有成员 只有派生的类型能访问该方法
    internal 类型和内嵌类型的所有成员 只能在包含它的程序集中访问该方法
    private 所有类型或成员 只能在它所属的类型中访问该方法
    protected internal 类型和内嵌类型的所有成员 只能在包含它的程序集中和派生类型的代码中访问该方法

    四、接口
    接口中只能包含方法、属性、索引器和事件的声明。接口不能实例化,不能有构造函数或字段,也不包含运算符重载。接口定义中还不允许声明成员的修饰符,成员接口总是public的,不能声明成virtual或者static
    4.1 接口的定义和实现
    //定义
    namespace InterfaceTest
    {
      
    public interface IBankAccount
      
    {
        
    void PayIn(decimal amount);
        
    bool Withdraw(decimal amount);
        
    decimal Balance
        
    {
          
    get;
        }

      }

    }


    //实现
    namespace InterfaceTest
    {
      
    public class SaverAccount:IBankAccount
      
    {
        
    private decimal balance;
        
    public void PayIn(decimal amount)
        
    {
          balance 
    += amount;
        }

        
    public bool Withdraw(decimal amount)
        
    {
          
    if(balance >= amount)
          
    {
            balance 
    -= amount;
            
    return true;
          }

          Console.WriteLine(
    "Withdrawal attempt failed.");
          
    return false;
        }

        
    public decimal Balance
        
    {
          
    get
          
    {
            
    return balance;
          }

        }

        
    public override string ToString()
        
    {
          
    return String.Format("Venus Bank Saver:Balance = {0,6:C}",balance);
        }

      }

    }

    4.2 派生的接口
    接口可以继承,其方式与类的继承相同。
  • 相关阅读:
    nyoj 95 众数问题(set)
    nyoj 93 汉诺塔(三)(stack)
    hdu 1010 Tempter of the Bone
    nyoj 55 懒省事的小明(priority_queue优先队列)
    nyoj 31 5个数求最值
    poj 1256 Anagram
    next_permutation函数
    nyoj 19 擅长排列的小明(深搜,next_permutation)
    nyoj 8 一种排序(用vector,sort,不用set)
    nyoj 5 Binary String Matching(string)
  • 原文地址:https://www.cnblogs.com/justnow/p/627703.html
Copyright © 2020-2023  润新知