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();
  • 相关阅读:
    weui-switch开关控件,表单提交后如何取值
    [转]判断存储过程、触发器、视图是否存在并删除
    修改服务器的3389端口
    如何在react-native 中优雅的使用 redux
    react native js 与 native 的通信与交互方式
    对 JS virtual DOM 的一知半解
    Python的实例方法,类方法,静态方法之间的区别及调用关系
    redux 管理你的 react 应用
    react- native 入门
    git 指南
  • 原文地址:https://www.cnblogs.com/mrfangzheng/p/1138574.html
Copyright © 2011-2022 走看看