abstract(C# 参考)

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

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

C#

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(C# 参考) 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用 sealed 修饰符的类无法继承,而abstract 修饰符要求对类进行继承。
  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

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

抽象方法具有以下特性:

  • 抽象方法是隐式的虚方法。
  • 只允许在抽象类中使用抽象方法声明。
  • 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
    public abstract void MyMethod();
    

    实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。

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

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

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

有关抽象类的更多信息,请参见抽象类、密封类及类成员(C# 编程指南)

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

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

C#

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

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

C#

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”的实例。

时间: 2024-11-08 06:12:08

abstract(C# 参考)的相关文章

C#继承中abstract、virtual、override和new

abstract 详细参考:https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类. 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现. 抽象类具有以下特性: - 抽象类不能实例化. - 抽象类可以包含抽象方法和抽象访问器. - 不能

C# 开发者审查代码的41条建议--转

转自:连接http://www.cnblogs.com/smiler/p/3274512.html 1. 确保没有任何警告(warnings). 2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了. 3. 去掉所有没有用到的usings.编码过程中去掉多余代码是个好习惯.(参考:msdn) 4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception. 5. 始终遵循命名规范.一般而言变量参

C#博文搜集

1. abstract (抽象类) 参考1 2. interface (接口) 参考1 C#博文搜集,码迷,mamicode.com

深入理解abstract class和interface

Abstract class Interface 实例化 不能 不能 类 一种继承关系,一个类只能使用一次继承关系.可以通过继承多个接口实现多重继承 一个类可以实现多个interface 数据成员 可有自己的 静态的不能被修改即必须是static final,一般不在此定义 方法 可以私有的,非abstract方法,必须实现 不可有私有的,默认是public,abstract 类型 变量 可有私有的,默认是friendly 型,其值可以在子类中重新定义,也可以重新赋值 不可有私有的,默认是pub

interface vs abstract

[interface vs abstract] 1.interface中的方法不能用public.abstract修饰,interface中的方法只包括signature. 2.一个类只能继承一个abstract class,却可以实现多个interface. 3.abstract class表示的是"is a"关系,描述一类对象的特性. 4.interface 表示的是能力的关系“capable”,描述一类对象是否拥有某种能力(是否继承哪个类). 参考: 1.http://wenku

final和synchronized和public abstract interface和匿名内部类

1.final   参考博文:http://lavasoft.blog.51cto.com/62575/18771/ 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表

Java面试参考指南(一)

Java是一种基于面向对象概念的编程语言,使用高度抽象化来解决现实世界的问题.    面向对象的方法将现实世界中的对象进行概念化,以便于在应用之间进行重用.例如:椅子.风扇.狗和电脑等. Java里的类(Class)是一个蓝图.模板,或者称之为原型,它定义了同一类事物的相同属性和行为.实例(Instance)是某个类的一个具 体实现,同一个类所有的实例拥有相同的属性.举例来说,你可以定义一个类叫做“房子(House)”,这个类拥有一个属性叫做“房间数 (number of room)”,这样你就

abstract class和interface有什么区别(转载自:XBOX)

abstract   class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract   class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract   class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.

Java面试参考指南(二)

访问修饰符 对于基本的OOPS(面向对象)概念,请看Java面试参考指南的第一部分.访问修饰符规定了一个类如何访问另一个类及它的成员(包括方法和变量). Java中有下列访问修饰符: private:私有变量和方法(非外部类)只能被声明它们的类的实例所使用. default:类中的数据.方法和它本身能够被声明为默认default.类中所有default成员都可以被本包中的其它类所访问. protected:相比default有更高的访问权限.只有成员变量和方法能够被声明为protected.父类