C#高级编制程序笔记 Day 三, 201陆年12月 15日 抽象类

1、虚方法:把三个基类函数证明为 virtual,就能够在任何派生类中重写该函数。

二、在Java 中具有函数都以杜撰的,不过在C# 中,C#
须求在派生类的函数重写另3个函数时,要采取 override 关键字显式注脚。

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

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

三、成员字段和静态函数都不能声称为 virtual
,因为那个概念只对类中的实例函数成员有含义。

四、隐藏方法:假若签名相同的措施在基类和派生类中都举办了声称,但该方法未有分别评释为
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();
    } 
}

陆、【专题】抽象类和抽象函数。(abstract)

  **抽象类:**

    • 抽象类不能被密封(sealed)。
    • 抽象类不能被实例化。
    • 只要类富含抽象函数,则该类也是抽象的。也务必表明为架空的。

  空洞函数:

    • 空泛函数不能够一贯促成,必须在非抽象的派生类中重写。
    • 架空函数自己也是杜撰的(就算也不要求提供 virtual
      关键字,实际上,假设提供了该重大字,就会发出三个语法错误。)不需求显式写出
      virtual。

 柒、密封类和密封方法。 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。
它涵盖3个办法 Dispose() ,该措施由类达成,用于清理代码。

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

  接口在语法上与声明抽象类完全相同,但不允许提供接口中其他成员的贯彻格局。1般意况下,接口只可以分包方法,属性,索引器和事件的宣示。不可能实例化接口,它只好分包其成员的签名。接口既不能够有构造函数,也不能够有字段。接口定义也不一致意包罗运算符重载,不允许申明关于成员的修饰符。接口成员总是共有的,不可能宣称为虚构或静态。

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

  Ⅰ、抽象类

    一 抽象类是破例的类,只是不能被实例化。除此而外,具有类的其余特色。

    贰 抽象类能够分包抽象方法,那是平凡类所无法的。

    叁抽象方法只可以宣称于抽象类中,且不分包其余达成,派生类必须覆盖他们。

    肆抽象类能够派生自一个抽象类,能够覆盖基类的虚幻方法也得以不掩盖,倘使不掩盖,则其派生类必须覆盖他们。

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

    一 不能够实例化。

    贰 包括未兑现的不2秘籍申明。

    3派生类必须贯彻未落实的办法,抽象类是架空方法,接口则是具有成员。(不仅是艺术,包括此外成员。)

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

  三个类能够壹直接轨四个接口,但只好直接接轨三个类(包涵抽象类)

  Ⅲ、抽象类和接口的分裂

    壹 类是对“对象”
的架空,把“抽象类”通晓为“把类当作对象”抽象成的类叫做抽象类。接口则为行为规范或鲜明。

    二 一个类三次能够完成多少个接口,但是只可以扩充三个父类。

    3 接口可以用于帮忙回调,而继续并不抱有这一个性格。

    四 抽象类不能被密封。

    伍 抽象类完毕的具体方法暗中同意为虚(virtual)的,但落实接口的类中的接口方法却暗许为非虚的。

    六好的接口定义应该是兼备专壹功效性的,而不是多效益的,不然造成接口污染。如若三个类只是实现了这么些接口中3个职能,而不得不去贯彻接口中的其余办法就叫接口污染。

    ⑦尽量防止使用持续来兑现组件功用,而是使用黑箱复用,即对象组合。因为三番五次的层系增多,造成最直白的结果就是当你调用这一个类群中的某一类,就必须把她们尽数加载到栈中。

    八如果抽象类完成接口,则足以把接口中方法映射到抽象类中作为抽象方法而不必完结,而在抽象类的子类中落到实处接口中方法。

  Ⅳ、抽象类和接口的使用

    壹假若预测要创制组件的八个本子,则开创抽象类。抽象类提供不难的点子来决定组件版本。

    二如果成立的遵守将在大范围的全异对象间接选举择,则动用接口。借使要规划小而简易的功用块,则使用接口。

    ③倘诺要统一筹划大的机能单元,则运用抽象类,假若要在组件的拥有达成间提供通用的已落成效益,则接纳抽象类。

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

 

网上一个挺好的例证:

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

 

相关文章