• 抽象类与抽象方法


    总结:

     1     /// <summary>
     2     /// 包含抽象方法的类必须是抽象类
     3     /// 反过来,如果一个类被标记为抽象类(作为父类而言),其内也必须包含抽象的方法或属性(索引器和事件没有试,理论应该也是可以)。对于子类抽象类而言,其内就可有可无
     4     /// </summary>
     5     abstract public class Super
     6     {
     7         abstract public void A();
     8 
     9         //抽象类中也可以包含非抽象方法,或者说,抽象类可有自己的实现,这是抽象类与接口的一个最大的区别!
    10         public void Method()
    11         {
    12             Console.WriteLine("Super.Method()");
    13         }
    14     }
    15 
    16     /// <summary>
    17     /// 情景1:子类是非抽象类
    18     /// </summary>
    19     public class DerivedA : Super
    20     {
    21         //子类是非抽象类时,父类中的抽象方法必须在子类中实现(重写)
    22         public override void A()
    23         {
    24             Console.WriteLine("DevicedA.A()");
    25         }
    26     }
    27 
    28     /// <summary>
    29     /// 情景2:子类是抽象类
    30     /// </summary>
    31     abstract public class DerivedB : Super
    32     {
    33         //子类是抽象类时,父类中的抽象方法,可实现,也可不实现
    34         //public override void A()
    35         //{
    36         //    Console.WriteLine("DevicedB.A()");
    37         //}
    38 
    39         //子类是抽象类时,子类内部可有也可没有抽象方法
    40         abstract public void B();
    41     }
    42 
    43     /// <summary>
    44     /// DerivedC只是演示必须实现所有继承过来的抽象方法(这么描述是否恰当?),缺少任意一个实现都会报编译错误
    45     /// </summary>
    46     public class DerivedC : DerivedB
    47     {
    48         public override void A()
    49         {
    50             Console.WriteLine("DevicedC.A()");
    51         }
    52         public override void B()
    53         {
    54             Console.WriteLine("DevicedC.B()");
    55         }
    56     }
    57 
    58     interface I
    59     {
    60         void M();
    61     }
    62 
    63     //抽象类必须为所有接口成员提供实现
    64     abstract public class DerivdeD : I
    65     {
    66         //实现接口的抽象类可以将接口方法映射到抽象方法上
    67         public abstract void M();
    68     }

    第二部分:知识点详解

        MSDN说明,https://msdn.microsoft.com/zh-cn/library/sf985hc5

        abstract 修饰符指示所修饰的内容缺少实现或未完全实现。abstract 修饰符可用于类、方法、属性、索引器和事件。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

    抽象类具有以下特性:

    • 抽象类不能实例化。

    • 抽象类可以包含抽象方法和抽象访问器。

    • 不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。

    • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

     1 abstract class ShapesClass
     2 {
     3     abstract public int Area();
     4 }
     5 class Square : ShapesClass
     6 {
     7     int side = 0;
     8 
     9     public Square(int n)
    10     {
    11         side = n;
    12     }
    13     // Area method is required to avoid
    14     // a compile-time error.
    15     public override int Area()
    16     {
    17         return side * side;
    18     }
    19 
    20     static void Main() 
    21     {
    22         Square sq = new Square(12);
    23         Console.WriteLine("Area of the square = {0}", sq.Area());
    24     }
    25 
    26     interface I
    27     {
    28         void M();
    29     }
    30     abstract class C : I
    31     {
    32         public abstract void M();
    33     }
    34 
    35 }
    36 // Output: Area of the square = 144

    在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

    抽象方法具有以下特性:

    • 抽象方法是隐式的虚方法。

    • 只允许在抽象类中使用抽象方法声明。

    • 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如

      public abstract void MyMethod();
      

      实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。

    • 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

    除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

    • 在静态属性上使用 abstract 修饰符是错误的。

    • 在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

    抽象类必须为所有接口成员提供实现。

    实现接口的抽象类可以将接口方法映射到抽象方法上。

     
  • 相关阅读:
    在Magento产品分类页面创建推荐产品
    任意两个时间之间的星期几的次数纵.sql
    SQL 日期格式化处理.sql
    系统应用程序域
    在ubuntu12.04中,apc_cache_find()
    buildertheory.cs
    复杂年月处理.sql
    CurrentAccounts.cs
    CLR和Windows加载器
    应用程序域
  • 原文地址:https://www.cnblogs.com/hzz521/p/5085451.html
Copyright © 2020-2023  润新知