C#C#高级编程笔记 Day 3, 2016年9月 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();

C# 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 属于 飞机
抽象类,鸽子属于 鸟 抽象类

 

相关文章