谢谢

解决方案 »

  1.   

    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP( Open-Closed Principle),抽象类是其中的关键所在。
      

  2.   

    abstract是个抽象方法,用它为其派生类提供一个公共的界面使用时,应该注意:1
    1
    抽象类智能作为其他的基类,它不能直接实例化,而且抽象类不能使用new操作符2
    抽象类允许包含抽象成员,但是这不是必须的
    3
    抽象类不能同时为密封的 一个方法如果前面加上abstract 就成了抽象方法!
      

  3.   

    abstract是个抽象方法,用它为其派生类提供一个公共的界面使用时,应该注意:1
    1
    抽象类智能作为其他的基类,它不能直接实例化,而且抽象类不能使用new操作符2
    抽象类允许包含抽象成员,但是这不是必须的
    3
    抽象类不能同时为密封的 一个方法如果前面加上abstract 就成了抽象方法!
      

  4.   

    abstract是个抽象方法
    不能被实例化~~~
    比如你做图片求面积
    你不知道是什么图形对吧
    那么你定义抽象类 下面的矩形 圆 扇形来进行求面积的方法
      

  5.   

    abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。在此例中,类 Square 必须提供 Area 的实现,因为它派生自 ShapesClass:  复制代码 
            abstract class ShapesClass
    {
        abstract public int Area();
    }
    class Square : ShapesClass
    {
        int x, y;
        // Not providing an Area method results
        // in a compile-time error.
        public override int Area()
        {
            return x * y;
        }
    }
     有关抽象类的更多信息,请参见抽象类、密封类及类成员(C# 编程指南)。备注
    抽象类具有以下特性:抽象类不能实例化。抽象类可以包含抽象方法和抽象访问器。不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。抽象方法具有以下特性:抽象方法是隐式的虚方法。只允许在抽象类中使用抽象方法声明。因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:   复制代码 
    public abstract void MyMethod();
     实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。在抽象方法声明中使用 static 或 virtual 修饰符是错误的。 除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用 abstract 修饰符是错误的。在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。 抽象类必须为所有接口成员提供实现。 实现接口的抽象类可以将接口方法映射到抽象方法上。例如:  复制代码 
    interface I 
    {
        void M();
    }
    abstract class C: I 
    {
        public abstract void M();
    }
     示例
    在本例中,DerivedClass 类是从抽象类 BaseClass 派生的。抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 X 和 Y。  复制代码 
    // abstract_keyword.cs
    // Abstract Classes
    using System;
    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);
        }
    }
     输出
      
    x = 111, y = 161
     注释
    在上面的示例中,如果试图通过使用下面的语句将抽象类实例化:  复制代码 
    BaseClass bc = new BaseClass();   // Error
     将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。