1.abstract修饰符

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

在此例中,类 Square 必须提供 Area 的实现,因为它派生自 ShapesClass

abstract class ShapesClass
    {        
    abstract public int Area();
    }   
    class Square : ShapesClass
    {        
    int side = 0;        
    public Square(int n)
        {
            side = n;
        }        
        // Area method is required to avoid
        // a compile-time error.
        public override int Area()
        {           
         return side * side;
        }        
        static void Main() 
        {
            Square sq = new Square(12);
            Console.WriteLine("Area of the square = {0}", sq.Area());
        }       
         interface I
        {            
        void M();
        }        
        abstract class C : I
        {            
        public abstract void M();
        }

    }    // Output: Area of the square = 144

抽象类具有以下特性:

  • 抽象类不能实例化。

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

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

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

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

抽象方法具有以下特性:

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

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

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

public abstract void MyMethod();
实现由一个重写方法重写提供,此重写方法是非抽象类的一个成员。

在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
在静态属性上使用 abstract 修饰符是错误的。
在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
有关抽象类的更多信息,请参见抽象类、密封类及类成员。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。  例如:
 interface I
        {            
        void M();
        }        
        abstract class C : I
        {            
        public abstract void M();
        }

在本例中,DerivedClass 类是从抽象类 BaseClass 派生的。  抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 XY

abstract class BaseClass   // Abstract class
    {        
    protected int _x = 100;        
    protected int _y = 150;        
    public abstract void AbstractMethod();   // Abstract method
        public abstract int X    { get; }        
        public abstract int Y    { get; }
    }    
    class DerivedClass : BaseClass
    {        
    public override void AbstractMethod()
        {
            _x++;
            _y++;
        }        
        public override int X   // overriding property
        {           
         get
            {                
            return _x + 10;
            }
        }        
        public override int Y   // overriding property
        {            
        get
            {               
             return _y + 10;
            }
        }       
         static void Main()
        {
            DerivedClass o = new DerivedClass();
            o.AbstractMethod();
            Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
        }
    }    // Output: x = 111, y = 161

在上面的示例中,如果尝试通过使用下面的语句将抽象类实例化:

BaseClass bc = new BaseClass();   // Error

将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。

备注:摘自:https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx

****************************************

2.sealed修饰符

当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。  在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承

class A {}      
sealed class B : A {}

还可以在重写基类中的虚方法或虚属性的方法或属性上使用 sealed 修饰符。  这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。

示例

在下面的示例中,ZY 继承,但 Z 无法重写在 X 中声明并在 Y 中密封的虚函数 F

class X
    {        
    protected virtual void F() { Console.WriteLine("X.F"); }        
    protected virtual void F2() { Console.WriteLine("X.F2"); }
    }    
    class Y : X
    {        
    sealed protected override void F() { Console.WriteLine("Y.F"); }        
    protected override void F2() { Console.WriteLine("Y.F2"); }
    }    
    class Z : Y
    {   // Attempting to override F causes compiler error CS0239.
        // protected override void F() { Console.WriteLine("C.F"); }

        // Overriding F2 is allowed.
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }
    当在类中定义新的方法或属性时,通过不将这些方法或属性声明为 virtual,可防止派生类重写这些方法或属性。
将 abstract 修饰符用于密封类是错误的做法,因为抽象类必须由提供抽象方法或属性的实现的类继承。
当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
由于结构是隐式密封的,因此它们不能被继承。
有关更多信息,请参见 继承。
有关更多示例,请参见抽象类、密封类及类成员。
sealed class SealedClass
    {        
    public int x;        
    public int y;
    }    
    class SealedTest2
    {        static void Main()
        {
            SealedClass sc = new SealedClass();
            sc.x = 110;
            sc.y = 150;
            Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
        }
    }    // Output: x = 110, y = 150

在上一个示例中,您可能尝试使用下面的语句从密封类继承:

class MyDerivedC: SealedClass {} // Error

将产生一条错误消息:

'MyDerivedC' cannot inherit from sealed class 'SealedClass'.


备注:转自https://msdn.microsoft.com/zh-cn/library/88c54tsw.aspx