class Program
{
static void Main(string[] args)
{
Car car = new Car();
car.Run();
car.Stop();
}
}
class Vehicle
{
public virtual void Run()
{
Console.WriteLine("Vehicle is Running");
}
public virtual void Stop()
{
Console.WriteLine("Vehicle is Stopped");
}
public virtual void Full()
{
Console.WriteLine("Full Fuel");
}
}
class Car:Vehicle
{
public override void Run()
{
Console.WriteLine("Car is Running");
}
public override void Stop()
{
Console.WriteLine("Car is Stopped");
}
}
}
我们发现这个例子中,Vehicle类中的方法根本没有用到过,而且Vehicle is Running 这种说法太不具体了。
因此我们修改Vehicle类,让方法里啥都别写了:
class Vehicle
{
public virtual void Run() { }
public virtual void Stop() { }
}
但是啥都别写这不合适吧,干脆把方法体也去掉吧,只留方法名
以下这段代码无法通过编译,只是举例用哦
class Vehicle
{
public virtual void Run() ;//这样是无法编译的
public virtual void Stop() ;//这样是无法编译的
}
本来就是虚方法(virtual),现在方法体也没了,更虚了,因此诞生了——抽象方法
abstract class Vehicle
{
public abstract void Run();
public abstract void Stop();
}
使用时,重写依然是override,因此仅仅替换即可,无需更改。
抽象类是专门为了做基类而生的,因为抽象类无法实例化,即使抽象类内部有实际的方法,也因为有抽象方法而无法调用所有的方法而报错。
例如:
abstract class Vehicle
{
public abstract void Run();
public abstract void Stop();
public void full()
{
Console.WriteLine("Full Fuel");
}
}
即使有具体方法full(),依然不可以实例化。
那么刚才说的这个特别抽象,抽象到不含有任何实际方法的抽象类
abstract class Vehicle
{
public abstract void Run();
public abstract void Stop();
}