zoukankan      html  css  js  c++  java
  • 用内部类(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();
  • 相关阅读:
    改变原数组的filter
    fireEvent2
    Ajaxを勉強しよ
    javascript 地图
    fillZero函数
    window.onerror
    とある要素以下にある textNode で一致する textNode を XPath で高速に取り出す
    判定是否为表单元素
    Django中判断用户是否登陆
    【 如果你和我一样在一栋33层大厦的27层工作,在这栋大厦里发生了火灾,那么你该怎么办? 看看也许会保住你的性命!!!】
  • 原文地址:https://www.cnblogs.com/mrfangzheng/p/1138574.html
Copyright © 2011-2022 走看看