用内部类(Nested Class)来模拟多继承

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
    
{
        
getreturn 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
    
{
        
getreturn 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();
原文地址:https://www.cnblogs.com/mrfangzheng/p/1138574.html