C#, Java等语言都不支持类的多继承, 也就是说一个类如果已经继承了一个父类了, 那么它就不能再继承其他类了, 这样从某种程度上说丧失了一些重用性. 典型的例子是: ASP.NET中要求所有的控件都必须继承自UserControl, 这样我们自定义的控件就不能直接继承自我们自己的抽象类, 一般做法是在中间引入一个自己的控件基类, 即: MyControl -> MyControlBase -> UserControl.
Interfaces:
public interface ICar


{

int Fuel
{get;set;}
void Run();
}
public interface IPlane


{

int Fuel
{get;set;}
void Fly();
}
Base classes:
public class abstract CarBase : ICar


{
private int mFuel = 0;
public virtual int Fuel

{

get
{ return mFuel; }

set
{ mFuel = value; }
}

public virtual void Run()

{
Fuel--;
Console.WriteLine( "Run
, Fuel = {0}", Fuel );
}
}

public class abstract PlaneBase : IPlane


{
private int mFuel = 0;
public virtual int Fuel

{

get
{ return mFuel; }

set
{ mFuel = value; }
}

public virtual void Fly()

{
Fuel-=2;
Console.WriteLine( "Fly
, Fuel = {0}", Fuel );
}
}
我们要造一辆同时具有Car和Plane的车, 但使用同一个油箱.
public partial class FlayableCar


{
ICar mCar;
IPlane mPlane;
int mFuel = 1000;
public ICar Car

{
if(mCar==null) mCar = new NestedCar(this);
return mCar;
}

public IPlane Plane

{
if(mPlane==null) mPlane = new NestedPlane(this);
return mCar;
}
}

public partial class FlayableCar


{
private class NestedCar : CarBase

{
FlayableCar mOuter;
public class NestedCar(FlayableCar outer)

{
this.mOuter = outer;
}
public override int Fuel

{
get

{
return mOuter.mFuel;
}
set

{
mOuter.mFuel = value
}
}
}
}


public partial class FlayableCar


{
private class NestedPlane : PlaneBase

{
FlayableCar mOuter;
public class NestedPlane(FlayableCar outer)

{
this.mOuter = outer;
}
public override int Fuel

{
get

{
return mOuter.mFuel;
}
set

{
mOuter.mFuel = value
}
}
}
}
使用
FlyableCar flyableCar = new FlyableCar();

ICar car = flyableCar.Car;
car.Run();

IPlane plane = flyableCar.Plane;
plane.Fly();