• 用内部类(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();
  • 相关阅读:
    c#+web下载文件夹
    c#+web下载文件夹
    ueditor+实现word图片自动上传
    ueditor+复制word+图片不能上传
    大文件上传速度解决方案
    html大文件上传下载
    上传文件夹 vue
    文件夹上传控件
    怎样退出App之前唤醒还有一个App?
    Data Matrix Font and Encoder条码控件可以以字体的形式来打印DataMatrix条形码
  • 原文地址:https://www.cnblogs.com/mrfangzheng/p/1138574.html
Copyright © 2020-2023  润新知