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

将一个类的子类划分成只分离一些函数部分是好的吗?

  •  2
  • prostynick  · 技术社区  · 15 年前

    假设我们有抽象类 A (C中的所有示例)

    public abstract class A
    {
        private Foo foo;
    
        public A() { }
    
        public void DoSomethingUsingFoo()
        {
            //stuff
        }
    
        public void DoSomethingElseUsingFoo()
        {
            //stuff
        }
    
        //a lot of other stuff...
    }
    

    但我们可以把它分成两类 B :

    public abstract class A
    {
        public A() { }
    
        //a lot of stuff...
    }
    
    public abstract class B : A
    {
        private Foo foo;
    
        public B() : base() { }
    
        public void DoSomethingUsingFoo()
        {
            //stuff
        }
    
        public void DoSomethingElseUsingFoo()
        {
            //stuff
        }
    
        //nothing else or just some overrides of A stuff
    }
    

    那很好,但是我们99.99%的确信,没有人会继承 ,因为 是非常重要的。

    如果有两个单独的类,只将一些代码分成两部分,并将函数元素分开,这样做还不错吗?

    7 回复  |  直到 15 年前
        1
  •  2
  •   Steve    15 年前

    对我来说,您的继承并没有实现代码重用和多态性的任何目的。继承并不意味着仅仅为了便于阅读而将一大块代码分成两部分。引入一个额外的层会带来比清晰更复杂的问题,所以我不认为这是你应该在这里做的事情。

    我建议您将类A保留为它原来的样子,然后当您找到更有力的理由进行重构时,再这样做。在那一刻,我也同意马克的看法,你应该考虑组合而不是继承。

        2
  •  2
  •   Mark Seemann    15 年前

    如果要引入一个附加的对象层次结构,那么最好这样做。大多数时候,没有。

    总的来说,你应该 偏爱组合胜过继承 . 这个 Strategy 设计模式在这方面非常有用。

        3
  •  0
  •   Chris McCauley    15 年前

    我不会把班级一分为二。主要原因是

    (a)您确定a在域中没有真正的独立存在。

    (b)设计的早期优化通常是一个错误——如果出现0.01%的可能性,那么以后重构就足够容易了。


    不要为小事操心

    很明显你已经想清楚了,所以要凭直觉去做。

        4
  •  0
  •   JustJeff    15 年前

    我将一些功能分割为一个单独的类的唯一原因是,当功能块足够重用时,您可以在其他地方消除重复,并且您可以获得一个良好的干净接口,支持这两种用途。否则,您就有可能引入高度耦合的对象,而维护人员很难使用这些对象。

        5
  •  0
  •   derdo    15 年前

    既然你说b中的功能非常重要,也许它需要自己的类。然后您可以将b作为a的一部分(如mark所建议的那样,组合而不是继承)。这也可能允许您更容易地测试b中的功能,而无需创建a。当然,这取决于b中的方法使用/滥用a中的数据/方法的程度。也许这些数据/方法也更适合b。如果B不作为一个单独的类来承载它自己的重量,那么我就把它保持原样。

        6
  •  0
  •   Paul    15 年前

    从设计的角度来看,没有一个类比另一个类更重要或更不重要。重要的是你设计的程序系统如何精确地映射真实的系统。例如,如果你想在格斗游戏中编程一个人体,你想编程的人体的任何部分都应该是一个单独的类(例如,不是因为在格斗中从来没有使用过指甲,而是一个不重要的类,假设你想有一个指甲类)。当然,一个类可以包含另一个类(也就是说,一个类是anothe类的实例),而那些提供信息的函数方法可以在util类中实现(也就是说,调试类包含调试相关的方法)。

    准确地映射真实系统的设计不仅提供编程好处,还提供架构好处,如灵活性和可扩展性。

        7
  •  0
  •   Damian Leszczyński - Vash    15 年前

    答案是否定的。

    为了实现这种类型的代码分离,开发人员应该为类、结构或接口使用partial关键字,并将它们存储在单独的文件中。

    逻辑课

    public partial class A
    {
        public A() { }
    
        //a lot of stuff...
    }
    

    职员班

    public partial class A
    {
        private Foo foo;
    
        public void DoSomethingUsingFoo()
        {
            //stuff
        }
    
        public void DoSomethingElseUsingFoo()
        {
            //stuff
        }
    
        //nothing else or just some overrides of A stuff
    }
    

    Usage of Partial Class

    自.NET3.0以来,还可以创建部分方法。

    逻辑课

    public abstract class A
    {
        public A() { }
    
        partial void DoSomethingUsingFoo();
        partial void DoSomethingElseUsingFoo();
    
    
        //a lot of stuff...
    }
    

    职员班

    public abstract class A
    {
        private Foo foo;
    
        partial void DoSomethingUsingFoo()
        {
            //stuff
        }
    
        partial void DoSomethingElseUsingFoo()
        {
            //stuff
        }
    
        //nothing else or just some overrides of A stuff
    }
    

    *分部方法不能有访问修饰符,如public、private或internal。

    Usage of Partial Methods