代码之家  ›  专栏  ›  技术社区  ›  Dongdong

如何将基类重新设计为泛型

  •  -1
  • Dongdong  · 技术社区  · 6 年前

    这是来自 天马

    public class BaseClass
    {
        public Method1();
        public Method2();
        Other methods...
    }
    public class A : BaseClass
    {
        public override Method1();
        public override Method2();
    }
    public class B : BaseClass
    {
        public override Method1();
        public override Method2();
    }
    public class C : BaseClass
    {
        public override Method1();
        public override Method2();
    }
    

    必须定制上述代码,且代码必须如下:

    public class BaseClass1 : BaseClass
    {
        public override Method1(); 
    }
    public class A1 : A 
    //There is a big problem here, 
    //if A1 inherit A, then cannot get changes from BaseClass1 
    //if A1 inherit BaseClass1, then cannot get changes from A
    //Same issue to class B1, C1, D1...
    {
        public override Method1(); 
    }
    public class B1 : B
    {
        public override Method1(); 
    }
    public class C1 : C
    {
        public override Method1(); 
    }
    

    团队B 只是,他们可以轻松做到:

    public class BaseClass2 : BaseClass1
    {
        public override Method1(); 
    }
    public class A2 : A1
    //Same problem here with TeamB
    {
        public override Method1(); 
    }
    public class B2 : B1
    {
        public override Method1(); 
    }
    public class C2 : C1
    {
        public override Method1(); 
    }
    

    问题很明显:除了TeamA之外,无论什么球队,如果我们需要定制的话,只需要一次 ,我们必须定制所有的类,这太重了!

    我的问题是:有没有一种方法可以从 天马 ,使代码通用,那么我们就不必做大量的定制了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   John Wu    6 年前

    你的问题并不是百分之百的清楚,但我猜这是一个核心产品工程团队(TeamA)负责生成平台代码,以及一个顾问或“专业服务”团队,他们负责产品并为客户实施。专业服务团队希望能够修改内容,但也能够从产品工程中获取补丁或版本升级,而无需进行代码合并。(否则,简单的解决方案是就地修改,而不是扩展和重写。)

    //This is what TeamA provides in a release
    
    public class BaseClass
    {
        public Method1();
        public Method2();
    }
    
    public class CustomBaseClass : BaseCLass
    {
        //No code. This is just a pass-through class
    }
    
    public class A : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class B : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class C : CustomBaseClass
    {
         public override Method1();
         public override Method2();
    }
    

    然后,当TeamB需要定制基类的某些内容时,他们只需要在一个地方完成,而不需要更改其他内容:

    //This is how it looks when TeamB is done with it
    public class BaseClass
    {
        public Method1();
        public Method2();
    }
    
    public class CustomBaseClass : BaseCLass
    {
        public override Method1(); //customized now, and will affect all existing classes automatically
    }
    
    public class A : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class B : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class C : CustomBaseClass
    {
         public override Method1();
         public override Method2();
    }
    

    当TeamB需要从TeamA获取产品版本时,他们可以保留CustomBaseClass(必须有一个仅用于定制的协议)并更新其他所有内容。这样定制是向前兼容的,不需要合并,只需要一点测试。

    //This is how it looks when TeamA provides a new release with a new method
    public class BaseClass
    {
        public Method1();
        public Method2();
        public NewMethod();
    }
    
    public class CustomBaseClass : BaseCLass
    {
        public override Method1(); //customized now, and will affect all existing classes automatically
    }
    
    public class A : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class B : CustomBaseClass
    {
        public override Method1();
        public override Method2();
    }
    
    public class C : CustomBaseClass
    {
         public override Method1();
         public override Method2();
    }