ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/b0797770-c1f3-4b4d-9441-b9122602a6bb.htm
抽象类的用途是提供多个派生类可共享的基类的公共定义。例如,类库可以定义一个作为其多个函数的参数的抽象类,并要求程序员使用该库通过创建派生类来提供自己的类实现。
抽象类具有以下特性:
-
抽象类不能实例化。
-
抽象类可以包含抽象方法和抽象访问器。
-
不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
-
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
-
抽象方法是隐式的虚方法。
-
只允许在抽象类中使用抽象方法声明。
-
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
public abstract void MyMethod();
-
实现由一个重写方法提供,此重写方法是非抽象类的成员。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
-
在静态属性上使用 abstract 修饰符是错误的。
-
在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。例如:
interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
============================================================
总结以下几点:
1.抽象类可以继承类,可以继承接口
示例一:


public class A
{
protected int x;
protected int y;
public A(){ }
protected virtual int AMethod()
{
return x * y;
}
}
public abstract class B : A
{
protected override int AMethod()
{
return x;
}
}
示例二:


public abstract class Page : System.Web.UI.Page
{
private TempDatas<string, Object> tempData;
public Page() { BindEvents(); }
/// <summary>
/// 页面临时数据
/// </summary>
public TempDatas<String, Object> TempData
{
get
{
if (tempData == null) tempData = new TempDatas<string, Object>();
return tempData;
}
}
public PageAdapter Html
{
get { return new PageAdapter(this); }
}
/// <summary>
/// 绑定事件
/// </summary>
protected virtual void BindEvents()
{
}
}
2.当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:


// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
3
如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork
无法调用类 D 上的 DoWork
。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。
.