澳门新萄京 1

【澳门新萄京】高级编程笔记

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#中抽象类和接口的界别】

  Ⅰ、抽象类

    ① 抽象类是例外的类,只是不可能被实例化。除外,具备类的其它特色。

    ② 抽象类能够分包抽象方法,那是平时类所不可能的。

    ③
抽象方法只好宣称于抽象类中,且不含有别的达成,派生类必须覆盖他们。

    ④
抽象类能够派生自三个抽象类,可以覆盖基类的充饥画饼方法也足以不掩盖,假如不隐瞒,则其派生类必须覆盖他们。

  Ⅱ 、接口:为援引类型。雷同于 类 ,在偏下三点经常抽象类。

    ① 无法实例化。

    ② 饱含未兑现的方法注解。

    ③
派生类必得得以达成未贯彻的诀窍,抽象类是空虚方法,接口则是有所成员。(不仅仅是办法,包括别的成员。卡塔尔

  接口除了能够饱含方法之外,还能分包属性,索引器,事件,并且那个分子都被定义为国有的。除外,不能包含别的别的成员。

  三个类能够直接接轨多个接口,但一定要后生可畏直接轨叁个类(富含抽象类卡塔 尔(英语:State of Qatar)

  Ⅲ、抽象类和接口的分别

    ① 类是对“对象”
的肤浅,把“抽象类”精通为“把类当做对象”抽象成的类叫做抽象类。接口则为行为标准或规定。

    ② 八个类二回能够落成多少个接口,然则只好扩大贰个父类。

    ③ 接口能够用于援救回调,而持续并不持有那天性格。

    ④ 抽象类不能够被密封。

    ⑤ 抽象类完毕的具体方法默以为虚(virtual卡塔 尔(英语:State of Qatar)的,但贯彻接口的类中的接口方法却默感到非虚的。

    ⑥
好的接口定义应该是兼顾专大器晚成效率性的,并非多职能的,否则形成接口污染。假诺叁个类只是实现了那几个接口中一个意义,而必须要去落到实处接口中的其他方法就叫接口污染。

    ⑦
尽量防止使用持续来兑现组件功用,而是使用黑箱复用,即对象组合。因为一而再三番一次的层系增添,产生最直接的结局正是当你调用这些类群中的某风度翩翩类,就必需把她们整个加载到栈中。

    ⑧
要是抽象类实现接口,则足以把接口中方法映射到抽象类中作为抽象方法而不用达成,而在抽象类的子类中贯彻接口中艺术。

  Ⅳ、抽象类和接口的利用

    
若是预测要制造组件的多少个版本,则开创抽象类。抽象类提供简单的主意来决定组件版本。

    ②
如若创设的效应就要大面积的全异对象间使用,则选择接口。即便要统筹小而简约的作用块,则使用接口。

    ③
若是要规划大的功效单元,则动用抽象类,要是要在组件的有所达成间提供通用的已落时效果与利益,则使用抽象类。

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

 

网络一个蛮好的事例:

  飞时机飞,鸟会飞,它们都落到实处了同贰个 接口 ”飞“,但 波音民用飞机集团747 归属 飞机
抽象类,鸽子属于 鸟 抽象类

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注