黑马程序员技术交流社区

标题: 抽象类 [打印本页]

作者: 李盛利    时间: 2012-10-24 18:09
标题: 抽象类
大家对抽象类怎么理解的??
作者: dqzg12300    时间: 2012-10-24 19:25
我个人觉得抽象类是一种类似于接口的存在。专门用来对付那些不确定的方法吧。因为可以重写嘛。还是坐等高人来吧
作者: fdiskfix    时间: 2012-10-24 20:22
抽象类可以理解为占位符或是功能的预先定义,需要子类进行完善和扩充
因为抽象类不能创建对象,所以需要有子类的继承才可以,可以将具有共享
的东西进行功能抽象,还是蛮有用的东西
作者: 朱坤福    时间: 2012-10-24 21:00
定义

一个类定义为抽象类是作为基类使用。这种类只能用于派生使用。比如从这个类派生其他类。我们不能通过这个类来创建对象。

一个类是抽象类由关键字abstract声明。抽象类的定义语法是

?
abstract class class-name
{
// members of the class
}
实现

抽象类一般包括有一个或者多个的抽象方法或者抽象属性。这些方法和属性不能直接被引用,但是我们派生类的时候必须进行重载这些方法和属性,以便派生类可以被实例化。在派生类中不重载那些方法及属性将会出现语法错误,除非派生的类也是一个抽象类。


在一些情况下,抽象类都是由一些继承体系中最顶层组成,比如例子中抽象类Shape具有一个抽象函数Draw()有二个抽象类Shape2D和Shape3D继承方法Draw(),而且并不提供该函数的引用。现在我们创建几个常用类Rectangle, Square和Circle从Shaper2D中继承,另外一组类Sphere, Cylinder和Cube重Shape3D中继承。所有在继承底层的类都必须重载抽象方法Draw().

?
public abstract class Shape
{
    //...Class implementation

    public abstract void Draw(int x, int y)
    {
        //this method mustn't be implemented here.
        //If we do implement it, the result is a Syntax Error.
    }
}

public abstract class Shape2D : Shape
{
    //...Class implementation
    //...you do not have to implement the the method Draw(int x, int y)
}

public class Cricle : Shape2D
{
    //here we should provide an implemetation for Draw(int x, int y)
    public override void Draw(int x, int y)
    {
        //must do some work here
    }
}
抽象属性

下面是一个实现抽象属性的例子。

在上面的例子中,有一个保护成员声明在抽象类中。在派生类absDerived中则定义了成员变量myNumber的get/set属性。

?
//Abstract Class with abstract properties
abstract class absClass
{
    protected int myNumber;
    public abstract int numbers
    {
        get;
        set;
    }
}

class absDerived : absClass
{
    //Implementing abstract properties
    public override int numbers
    {
        get
        {
            return myNumber;
        }
        set
        {
            myNumber = value;
        }
    }
}
一些需要注意的地方

一个抽象类不能是一个密封的类
一个抽象方法不能被私有
一个抽象方法不能被virtual修饰,因为抽象方法本身隐式就是虚的了。
一个抽象方法不能是静态函数
抽象类的方法的修饰词必须跟其派生类中的方法修饰词一致。如果你声明了一个受保护的抽象方法,那么它在派生类中也必须被声明称保护的。否则编译器会报错。
抽象方法跟虚函数之间的不同点

虚函数可以被应用和在派生类中可以进行重载它。而抽象方法不能被直接应用,强制必须在派生类中进行重载它。

综述

在上面几点中我们讲了C#中的抽象类。抽象类是一个不能被直接实例化的类,但是它的后代能偶被直接实例化。
作者: 李行周    时间: 2012-10-24 23:59
C#抽象类
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下方面是不同的:
•        抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
•        允许(但不要求)抽象类包含抽象成员。
•        抽象类不能被密封。
当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。在下面的示例中
abstract class A
{
   public abstract void F();
}
abstract class B: A
{
   public void G() {}
}
class C: B
{
   public override void F() {
      // actual implementation of F
   }
}
抽象类 A 引入抽象方法 F。类 B 引入另一个方法 G,但由于它不提供 F 的实现,B 也必须声明为抽象类。类 C 重写 F,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非必须)将 C 声明为非抽象类。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2