C# 关键字---abstract

时间秒杀一切 提交于 2019-12-29 05:01:17

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

抽象类具有以下特性:

  • 抽象类不能实例化。

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

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

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

抽象方法具有以下特性:

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

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

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

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

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

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

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

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

MSDN的示例:

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

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

当如果尝试通过使用下面的语句将抽象类实例化时,将出现error:

BaseClass bc = new BaseClass();   // Error

 

当抽象类实现接口时,抽象类必须为所有接口成员提供实现。实现接口的抽象类可以将接口方法映射到抽象方法上。例如:

interface I{    void M();}abstract class C : I{    public abstract void M();}


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!