面向对象之抽象类

【抽象类】

 

概念,三个点:

1.抽象类不能被实例化;

2.子类必须重写父类中的抽象方法;

3.如果类中包括抽象方法,那么该类必须被定义为抽象类,而不论是否包括其他一般方法。

宗旨:抽象类应尽可能拥有更多的共同代码,更少的数据。 

 

 

表现

  关键字:abstract、override。

  抽象方法不能有方法体,以“;”结尾,没有“{}”。

  不同于多态的virtual和override。virtual修饰的不一定是方法,除了字段不能虚拟,属性、事件和索引器都可以是虚拟的,方法会有方法体,子类也不一定要去override其父类的方法,属性等。抽象也是不能抽象字段,其他均可。

 

特点:

抽象类具有以下特性:

  • 抽象类不能实例化;
  • 抽象类可以包含抽象方法和抽象访问器;
  • 不能用Sealed修饰符修改抽象类,这意味着抽象类不能被继承;
  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现;
  • 在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

抽象方法具有以下特性:

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

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

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

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

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

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

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

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

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

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

 

 

例子:

using System;
abstract class BaseClass
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod();
public abstract int X { get; }
public abstract int Y { get; }
}

class DerivedClass : BaseClass
{
public override void AbstractMethod()
{
_x++;
_y++;
}

public override int X
{
get
{
return _x + 10;
}
}

public override int Y
{
get
{
return _y + 10;
}
}

static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
posted @ 2008-07-22 15:48  TerryGao  阅读(596)  评论(1编辑  收藏  举报