抽象分为抽象类,抽象方法
(1)抽象类
类声明前加一个abstract关键字,表示此类是抽象类,抽象类不能被实例化。示例:public abstract class A{};
(2) 抽象方法
仅仅只有abstract class才能够abstract method。
抽象方法没有函数体,以“;”结束。派生类若想能够实例化,必须实现抽象方法,示例:
public abstract class A
{
public abstract void DoWork(int i);
}
(3)抽象方法的传递性
要在派生类中实现抽象方法,必须用到关键词override,所以抽象方法具有传递性,示例如下:
namespace ConsoleApplication7Abstract
{
abstract class Class1
{
public void func1(int x)
{
Console.WriteLine("this is method in abstract class");
}
public abstract void func2(string str);
}
class Class2:Class1
{
public override void func2(string str) //must add override for this method
{
Console.WriteLine("this is method in derived class");
}
}
class Class3 : Class2
{
public override void func2(string str)
{
base.func2(str);
}
}
}
(4)抽象,多态,接口的比较
就像private,protected,public中的protected介于private和protected之间,abstract的作用同样介于virtual,interface之间。
virtual是基类定义了virtual属性,方法,但是派生类完全可以不去override他们。
interface是定义了属性,方法的接口,派生类必须去完全实现他们。
abstract则是在基类中定义了部分接口,这部分接口派生类必须去实现它。然而abstract class中也可以定义virtual method,一般的非
virtualmethod。所以abstract的作用能力在virtual 和interface之间,基类有必须要实现的也有可以去选择实现的。
(5)抽象类可以用abstract 重写 virtual方法
class Class2
{
public override void func2(string str)
{
Console.WriteLine("this is method in derived class");
}
public virtual void funv()
{
}
public virtual void funva()
{
Console.WriteLine("this is virtual method in abstract class");
}
}
abstract class Class3 : Class2
{
public override void func2(string str)
{
base.func2(str);
}
public abstract override void funva(); //use abstract to override virtual method
}
上面将virtual声明为abstract,则对于从抽象类来说继承的方法依然是virtual method