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();
  • 相关阅读:
    ONNX 开始
    Linux 性能相关工具
    Prometheus + Grafana 快速上手
    RTSP 流相关工具介绍
    TensorFlow Serving
    TensorFlow 的 JupyterLab 环境
    【排序算法动画解】排序介绍及冒泡排序
    上课老师提问我什么是二叉查找树,我把这些动图拿了出来,动图图解及代码实现。
    如何找东西?查找算法之顺序查找和二分查找详解
    【数据结构和算法:简单方法】谈一谈优先队列的实现
  • 原文地址:https://www.cnblogs.com/mrfangzheng/p/1138574.html
Copyright © 2011-2022 走看看