高级编制程序笔记

1、虚方法:把三个基类函数评释为 virtual,就足以在此外派生类中重写该函数。

风度翩翩.世袭的档次
  在面向对象的编制程序中,有二种判若两人世袭类型:达成持续和接口世襲
  1.贯彻持续和接口世袭
  *实现持续:表示三个项目派生于基类型,它抱有该基类型的具有成员字段和函数。在促成持续中,派生类型应用基类型的各样函数的实今世码,除非在派生类型的概念中钦点某些函数的兑今世码。在需求给现存的花色丰富效果,或大多辅车相依的档期的顺序分享意气风发组第生龙活虎的公共职能时,能够运用那类别型的三番五次。
  *接口世襲:表示三个品类只持续了函数的签订合同,未有世襲任何的代码。在需求钦定该品种拥有某个可用的特性时,最棒使用那类别型的延续。
  2.多种世襲
  C#不补助多种继承,但C#同意项目派生自四个接口————多重接口世袭。那表明,C#类能够派生自另三个类和轻易四个接口。更确切的说,因为System.Object是三个集体的基类,所以每一个C#(除Object之外卡塔 尔(阿拉伯语:قطر‎都有贰个基类,还能有自由八个接口。
  3.组织的世襲
  使用结构的贰个限量是布局不帮衬促成持续,但种种组织都自动派生自System.ValueType。不可能编码落成项目等级次序的构造,但组织得以兑现接口。

2、在Java 中兼有函数都是假造的,然则在C# 中,C# 必要在派生类的函数重写另多个函数时,要运用 override 重大字显式表明。

二.世襲的兑现
  语法:
  class MyDreved:BaseClass
  {

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

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

  }
  借使类或结构也派生自接口,则用逗号分隔列表中的基类和接口:
  class MyDreved:BaseClass,IIntenface1,IIntenface2
  {

3、成员字段和静态函数都无法宣称为 virtual ,因为那个概念只对类中的实例函数成员有意义。

  }

4、隐敝方法:尽管签字相符的不二等秘书技在基类和派生类中都开展了注明,但该办法未有分级评释为 virtual 和 override ,派生类的方法就能暗藏基类方法。在大部情景下,是要重写方法,实际不是躲避方法,因为隐蔽方法会招致对于给定类的实例调用错误方法的危急。在c#中,要藏匿贰个主意,应该运用 new 关键字声明。

  假若在类定义中未有一些名基类,C#编写翻译器就假定System.Object是基类。

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

  1.虚方法
  把三个基类函数申明为virtual,就足以在别的派生类中重写该函数:
  class BaseClass
  {
    public virtual void VirtualMethod()
    {
      //
    }
  }

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

  也能够把质量申明为virtual。对于虚属性或重写属性,语法与非虚属性相近,但要在概念中增多virtual关键字:
  public virtual string Name
  {
    get;set;
  }

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

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

  C#中虚函数的定义与规范OOP的定义同样:能够在派生类中重写虚函数。在调用方法时,会调用该派生类的妥帖格局。在C#中,函数暗许情况下不是虚的,但能够显式的宣示为virtual。
  在派生类中重写叁个函数时,要动用override关键字显得表明:
  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      //
    }
  }

6、【专项论题】抽象类和浮泛函数。(abstract)

  成员字段和静态函数都不可能宣称为virtual,因为那些概念只对类中的实例函数成员有意义。

  **抽象类:**

  2.隐身方法
  假使签名雷同的情势在基类和派生类中都开展了申明,但该办法未有分别注脚为virtual和override,派生类方法就能暗藏基类方法。

    • 抽象类无法被密封(sealed卡塔尔。
    • 抽象类无法被实例化。
    • 设若类包蕴抽象函数,则该类也是画个饼来解除饥饿的。也不得不表明为架空的。
class A {    public void a()    {      Console.WriteLine('CLASS is A');    } }class B:A{    public void a()    {       Console.WriteLine('CLASS is B');    }}class client {    static void main()    {        B b=new B();       A a=b;       a.a();          b.a();    }}/*输出CLASS IS ACLASS IS B*/

  空泛函数:

  在大部分情况下,是要重写方法,并非隐讳方法,因为掩瞒方法会变成对于给定类的实例调用错误的艺术。不过,C#语法会在编写翻译时收取那一个地下错误的警示。

    • 空泛函数不可能一贯促成,必须在非抽象的派生类中重写。
    • 架空函数自身也是编造的(即便也不须求提供 virtual 关键字,实际上,假使提供了该重大字,就能够爆发三个语法错误。卡塔 尔(阿拉伯语:قطر‎无需显式写出 virtual。

  在C#中,要潜伏二个措施应利用new 关键字注明,那样在编写翻译时就不会发出警示:
  class A
  {
    public void a()
    {
      Console.WriteLine('CLASS is A');
    }
  }

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

  class B:A
  {
    public new void a()
    {
       Console.WriteLine('CLASS is B');
    }
  }

  对于类:表示不能世襲该类。

  3.调用函数的基类版本
  C#能够从派生类中调用方法的中央版本:base.<MethodName>()
  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      base.VirtualMethod();
    }
  }
  能够接收base.<MethodName>()语法调用基类中的任何方式,不必从同一方法的重载中调用它。

  对于措施:表示不可能重写该办法。

  4.抽象类和抽象函数
  C#同意把类和函数注明为abstract.抽象类不能够实例化,而肤浅不能直接实现,必需在非抽象的派生类中重写。分明抽象函数也是设想的(就算无需提供virtual,实际上,也无法提供该重大字卡塔 尔(阿拉伯语:قطر‎。
  如若类包含抽象函数,则该类也是空洞的,也必须要注明为架空的:
  abstract class Building
  {
    public abstract void Cal();
  }

  string 为密封类。

  抽象类中不可能注解非抽象方法,但能够证明别的的非抽象成员。

  要在艺术或性能上运用 sealed 关键字,必得先从基类上把它注明为要重写的格局或质量。借使基类上不期待有重写的方法或性质,就毫无把它表明为 virtual。

  5.密封类和密闭方法
  C#允许把类和方法评释为sealed。对于类,那意味着无法持续该类;对于措施,表示不可能重写该措施。
  sealed class A
  {

8、【派生类中的构造函数试行进度】

  }

abstract class GenericCustomer{
    private string name;
}

class NevermoreCustomer:GenericCustomer{
    private uint highCostMinutesUsed;
}

GenericCustomer customer=new NevermoreCustomer();

  class B:A //报错
  {

图片 1

  }

 

  假若基类上不期待有重写的主意和属性,就毫无把它证明为virtual.

  【试行进程】:编译器首先找到它试图实例化的类的构造函数,在本例中是 NevermoreCustomer ,那几个私下认可 NevermoreCustomer 构造函数首先要做的是为其直接基类 GenericCustomer 运营私下认可构造函数,然后GenericCustomer 构造函数为其一贯基类System.Object 运维默许构造函数,System.Object 未有此外基类,所以它的构造函数就施行,并把控制权重临给GenericCustomer 构造函数,以往进行 GenericCustomer 构造函数, 把变量 name 初阶化 为 null 。再把调整权重临给 NevermoreCustomer 构造函数, 接着实施那几个构造函数, 把 highCostMinuteUsed 伊始化为 0 并脱离。

  6.派生类的构造函数
  假定没有为其余类定义任何呈现的构造函数,编写翻译器就能够为持有的类提供暗中同意的开首化构造函数,在后台编写翻译器能够很好的缓解类的档案的次序结构中的难题,每一个类中的每种字段都会开头化为相应的默许值。
  在开立派生类的实例时,实际上会有多少个构造函数起功用。要实例化的类的构造函数本身无法伊始化类,还非得调用基类中的构造函数。
  构造函数的调用顺序是先调用Object,在固守档次结构调用基类的构造函数,由基类到父类,直到达到要实例化的类甘休。在这里个进度中,每种构造函数都开始化它和睦的类中的字段。因为最初调用的连天基类的构造函数,所以派生类在推行过程中能够访谈任何基类的成员,因为基类已经协会出来了,其字段也发轫化了。

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

  *在档案的次序结构中加多无参数的构造函数
    在档期的顺序结构中加多三个无参数的构造函数会交替默许的构造函数,所以在试行进度中,会暗中认可调用基类中加上的无参数的构造函数。别的地点不改变。
  *在档期的顺序结构中增多带参数的构造函数
  在档次结构中要调用这么些带参数的构造函数,须求在父类的构造函数中展现调用:

9、this 和 base

public abstract class GenericCustomer{    private string name;    public GenericCustomer()    {        name = "<no name>";    }    public GenericCustomer(string name)    {        this.name = name;    }    public string Name     {         get {return name;}        set {name = value;}    }}public class Nevermore60Customer : GenericCustomer{    private string referrerName;    private uint highCostMinutesUsed;    ublic Nevermore60Customer(string name) : this(name, "            <None>")    {    }    public Nevermore60Customer(string name, string referrerName) : base    {        this.referrerName = referrerName;    }    public string ReferrerName    {        get {return referrerName;}         set {referrerName = value;}    }}    

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

三.修饰符
  修饰符能够钦命方法的可知性:如public或private,还足以内定风流倜傥项的本色,如方法是virtual或abstract.
  1.可以看到性修饰符
  修饰符        应用于                  说明
  public         全体类和成员              任何代码能够访问
  protected      类的分子和内嵌类            独有在类内部和派生类中做客
  internal       全体类和成员              独有在类内部和包含它的顺序聚焦拜会
  private         类的成员和内嵌类            唯有在类内部访问
  protected internal  类的分子和内嵌类            只有在类内部,派生类杏月富含它的主次聚焦访谈

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

  不可能把类定义为protected,private,protected internal,因为那么些修饰符对于包括在称呼空间中的类型未有意义。由此那个修饰符只可以利用于成员。不过足以用这一个修饰符定义嵌套的类(内嵌类,包罗在此外类中的类卡塔尔国,因为在这里种情景下,类也富有成员的情状:
  public class OuterClass
  {
    protected class InnerClass
    {

10、接口 。Microsoft 预订义的二个接口 System.IDisposable。 它包涵叁个办法 Dispose() ,该方式由类完毕,用于清理代码。

    }
  }

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

  2.别样修饰符
  修饰符    应用于      说明
  new      函数       遮盖函数
  static     全部成员     静态
  virtual    函数       成员能够由派生类重写
  abstract    类,函数     抽象
  override   函数       重写虚构和架空的成员
  sealed     类,方法,属性 不能一而再和重写
  extern   仅静态方法    成员在表面用另生机勃勃种语言达成

  接口在语法上与注明抽象类完全雷同,但不允许提供接口中别的成员的贯彻格局。日常景况下,接口只好分包方法,属性,索引器和事件的宣示。不可能实例化接口,它只可以分包其成员的具名。接口既不可能有构造函数,也无法有字段。接口定义也区别意包括运算符重载,不允许评释关于成员的修饰符。接口成员总是共有的,不可能声称为杜撰或静态。

四.接口
  public interface IDisposable
  {
    void Dispose();
  }

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

  表明接口在语法上和证明抽象类完全相符,但不允许提供任何成员的贯彻形式。抽象类能够提供除方法之外的其它成员的完结情势,比如属性。
  日常景色下,接口只可以分包方法,属性,索引器和事件的扬言。
  不能够实例化接口,接口即无法有构造函数,也不能够有字段。接口定义也差别意包含运算符重载。
  在接口中不允许评释关于成员的修饰符。接口成员总是公有的,无法宣称为设想和静态。假如须要,在完结的类中宣示。

  Ⅰ、抽象类

  达成接口的类必得完毕接口的具有成员。
  接口能够并行世襲,其方法与类的接轨格局肖似。

    ① 抽象类是杰出的类,只是不可能被实例化。除此而外,具备类的任何特色。

    ② 抽象类能够饱含抽象方法,那是日常类所不可能的。

    ③ 抽象方法只可以声称于抽象类中,且不含有其他完成,派生类必需覆盖他们。

    ④ 抽象类能够派生自二个抽象类,能够覆盖基类的虚幻方法也可以不隐讳,如果不蒙蔽,则其派生类必得覆盖他们。

  Ⅱ 、接口:为引用类型。相像于 类 ,在偏下三点平时抽象类。

    ① 不能够实例化。

    ② 饱含未兑现的办法注脚。

    ③ 派生类必需兑现未落到实处的章程,抽象类是架空方法,接口则是享有成员。(不止是情势,富含别的成员。卡塔尔国

  接口除了可以包罗方法之外,还能包涵属性,索引器,事件,何况这么些分子都被定义为国有的。除却,无法包蕴别的此外成员。

  四个类能够直接接轨三个接口,但一定要一贯接轨二个类(包涵抽象类卡塔尔国

  Ⅲ、抽象类和接口的分别

    ① 类是对“对象” 的虚幻,把“抽象类”领会为“把类当作对象”抽象成的类叫做抽象类。接口则为行为标准或规定。

    ② 二个类二遍能够兑现多少个接口,可是只可以扩大八个父类。

    ③ 接口可以用来援救回调,而持续并不具有那些特点。

    ④ 抽象类不能够被密闭。

    ⑤ 抽象类达成的具体方法默以为虚(virtual卡塔尔国的,但达成接口的类中的接口方法却默认为非虚的。

    ⑥ 好的接口定义应该是有着专黄金年代功能性的,实际不是多效果与利益的,不然变成接口污染。假设多个类只是达成了这些接口中多个效率,而一定要去贯彻接口中的别的情势就叫接口污染。

    ⑦ 尽量制止使用持续来完结组件功效,而是采纳黑箱复用,即对象组合。因为一而再的层系增添,变成最间接的结局正是当你调用那几个类群中的某意气风发类,就不得不把她们整个加载到栈中。

    ⑧ 假使抽象类完毕接口,则能够把接口中方法映射到抽象类中作为抽象方法而不必完成,而在抽象类的子类中达成接口中方法。

  Ⅳ、抽象类和接口的运用

    ① 借使预测要开创组件的五个本子,则创设抽象类。抽象类提供轻易的法子来调控组件版本。

    ② 假使成立的法力就要大规模的全异对象直接收,则动用接口。固然要统筹小而轻松的成效块,则选取接口。

    ③ 倘若要统筹大的成效单元,则运用抽象类,如若要在组件的全部达成间提供通用的已达成效果与利益,则采纳抽象类。

    ④ 抽象类首要用来关系紧凑的指标,而接口符合为不想关的类提供通用功效。

 

互连网多少个蛮好的例证:

  飞机缘飞,鸟会飞,它们都贯彻了同三个 接口 ”飞“,但 波音公司747 归属 飞机 抽象类,鸽子归于 鸟 抽象类

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:高级编制程序笔记

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。