C#高级编程笔记 Day 3, 2016年四月 8日 抽象类

1、虚方法:把一个基类函数表明为 virtual,就可以在别的派生类中重写该函数。

2、在Java 中负有函数都是虚构的,不过在C# 中,C#
须要在派生类的函数重写另一个函数时,要接纳 override 重视字显式申明。

//父类
class MyBaseClass{
    public virtual string VirtualMethod(){
        return "This is test!";
    }
}

//派生类
class MyDerivedClass:MyBaseClass{
    public override string VirtualMethod(){
        return "Haha, I override you."
    }
}

3、成员字段和静态函数都不可以宣称为 virtual
,因为那么些定义只对类中的实例函数成员有意义。

4、隐藏方法:若是签名相同的点子在基类和派生类中都展开了声称,但该形式没有分别讲明为
virtual 和 override
,派生类的措施就会隐藏基类方法。在大部情景下,是要重写方法,而不是隐藏方法,因为隐藏方法会促成对于给定类的实例调用错误方法的险恶。在c#中,要潜伏一个措施,应该使用
new 关键字评释。

class MyDerivedClass:MyBaseClass{
    public new string VirtualMethod(){
        //...
        return 0;
    }
}

5、调用函数的基类版本 : base . <MethodName>()

class MyBaseClass{
    public virtual string getName(){
        return "Hello ,Robert!";
    }
}

class MySonClass : MyBaseClass{
    public override string getName(){
        return base.getName();
    } 
}

6、【专题】抽象类和虚幻函数。(abstract)

  **抽象类:**

    • 抽象类不可以被密封(sealed)。
    • 抽象类不可以被实例化。
    • 比方类富含抽象函数,则该类也是空泛的。也务必声明为架空的。

  空洞函数:

    • 空泛函数不可能平素促成,必须在非抽象的派生类中重写。
    • 架空函数本身也是虚构的(即便也不须要提供 virtual
      关键字,实际上,如若提供了该重大字,就会发出一个语法错误。)不要求显式写出
      virtual。

 7、密封类和密封方法。 sealed 

  对于类:表示不可以一而再该类。

  对于艺术:表示不可以重写该方法。

  string 为密封类。

  要在点子或性质上行使 sealed
关键字,必须先从基类上把它表明为要重写的点子或品质。假诺基类上不希望有重写的法门或性质,就无须把它申明为
virtual。

8、【派生类中的构造函数执行进程】

abstract class GenericCustomer{
    private string name;
}

class NevermoreCustomer:GenericCustomer{
    private uint highCostMinutesUsed;
}

GenericCustomer customer=new NevermoreCustomer();

图片 1

 

  【执行过程】:编译器首先找到它试图实例化的类的构造函数,在本例中是
NevermoreCustomer ,那些默许 NevermoreCustomer
构造函数首先要做的是为其一贯基类 GenericCustomer
运行默许构造函数,然后GenericCustomer 构造函数为其直接基类System.Object
运行默许构造函数,System.Object
没有其他基类,所以它的构造函数就推行,并把控制权重返给GenericCustomer
构造函数,现在施行 GenericCustomer 构造函数, 把变量 name 初步化 为 null
。再把控制权再次来到给 NevermoreCustomer 构造函数, 接着执行那几个构造函数,
把 highCostMinuteUsed 初步化为 0 并退出。

   构造函数的调用顺序是先调用 System.Object,
再依据层次结构由上向下举行。直到达到编译器要实例化的类停止。

9、this 和 base

  this 为调用当前类中的其余构造方法。

  base 在派生类中应用时,调用基类中的构造方法。

10、接口 。Microsoft 预约义的一个接口 System.IDisposable。
它含有一个艺术 Dispose() ,该格局由类完毕,用于清理代码。

1 public interface Idisposable{
2     void Dispose();
3 }

  接口在语法上与申明抽象类完全相同,但不一致意提供接口中其余成员的贯彻格局。一般情状下,接口只可以分包方法,属性,索引器和事件的扬言。无法实例化接口,它不得不分包其成员的签字。接口既不能有构造函数,也不可以有字段。接口定义也不容许蕴涵运算符重载,不容许表明关于成员的修饰符。接口成员总是共有的,不可能宣称为虚拟或静态。

11、【专题 C#中抽象类和接口的分别】

  Ⅰ、抽象类

    ① 抽象类是破例的类,只是无法被实例化。除此之外,具有类的任何特色。

    ② 抽象类可以涵盖抽象方法,那是常见类所不可能的。

    ③
抽象方法只好声称于抽象类中,且不带有其余已毕,派生类必须覆盖他们。

    ④
抽象类可以派生自一个抽象类,能够覆盖基类的悬空方法也可以不掩盖,如若不掩盖,则其派生类必须覆盖他们。

  Ⅱ 、接口:为引用类型。类似于 类 ,在偏下三点一般抽象类。

    ① 不可能实例化。

    ② 包涵未兑现的格局声明。

    ③
派生类必须贯彻未落到实处的点子,抽象类是空泛方法,接口则是有着成员。(不仅是格局,包罗其余成员。)

  接口除了能够涵盖方法之外,仍能蕴含属性,索引器,事件,而且那几个分子都被定义为国有的。除此之外,无法包蕴其余其余成员。

  一个类可以一直接轨八个接口,但只可以一直接轨一个类(包蕴抽象类)

  Ⅲ、抽象类和接口的界别

    ① 类是对“对象”
的空洞,把“抽象类”领悟为“把类当作对象”抽象成的类叫做抽象类。接口则为行为规范或确定。

    ② 一个类四次能够达成多少个接口,不过只可以扩大一个父类。

    ③ 接口可以用于辅助回调,而屡次三番并不具有那一个特性。

    ④ 抽象类不可以被密封。

    ⑤ 抽象类达成的具体方法默认为虚(virtual)的,但已毕接口的类中的接口方法却默许为非虚的。

    ⑥
好的接口定义应该是负有专一成效性的,而不是多职能的,否则造成接口污染。假若一个类只是完结了那几个接口中一个作用,而只可以去落实接口中的其余艺术就叫接口污染。

    ⑦
尽量幸免使用持续来促成组件功用,而是接纳黑箱复用,即对象组合。因为一连的层次增多,造成最直白的结局就是当您调用那一个类群中的某一类,就非得把她们一切加载到栈中。

    ⑧
如若抽象类完毕接口,则足以把接口中方法映射到抽象类中作为抽象方法而无需达成,而在抽象类的子类中贯彻接口中方法。

  Ⅳ、抽象类和接口的施用

    
若是预测要创立组件的三个本子,则开创抽象类。抽象类提供简单的章程来支配组件版本。

    ②
若是创设的职能将在大范围的全异对象间接纳,则动用接口。假如要设计小而简易的效能块,则使用接口。

    ③
即便要统筹大的机能单元,则应用抽象类,倘若要在组件的拥有达成间提供通用的已落成效益,则拔取抽象类。

    ④
抽象类主要用来关系密切的靶子,而接口适合为不想关的类提供通用功效。

 

网上一个挺好的例证:

  飞机会飞,鸟会飞,它们都落实了同一个 接口 ”飞“,但 波音747 属于 飞机
抽象类,鸽子属于 鸟 抽象类

 

相关文章