将类子类化为仅分离一些功能部分是否合适?

时间:2010-03-25 08:35:47

标签: oop class-design

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

public abstract class A
{
    private Foo foo;

    public A() { }

    public void DoSomethingUsingFoo()
    {
        //stuff
    }

    public void DoSomethingElseUsingFoo()
    {
        //stuff
    }

    //a lot of other stuff...
}

但我们可以将其拆分为两个类AB

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%肯定,没有人会继承A,因为B中的功能非常重要。

有两个单独的类只是将一些代码分成两部分并分离功能元素仍然是好的吗?

7 个答案:

答案 0 :(得分:2)

如果有引入额外对象层次结构的目的,那么这样做是个好主意。大多数时候,没有。

一般来说,你应该赞成合成优于继承Strategy设计模式在这方面非常有用。

答案 1 :(得分:2)

对我而言,您的继承不能用于代码重用和多态的任何目的。继承并不仅仅用于将大量代码分成两个地方,只是为了便于阅读。引入额外的层会带来更多的复杂性而不是清除,所以我不认为这是你应该做的事情。

我建议你把A级留下来,然后当你找到更强的理由进行重构时,你会这样做。那一刻,我也同意马克认为你应该考虑构成而不是继承。

答案 2 :(得分:0)

我不会把班级分成两部分。

的主要原因

(a)您确定A在域中并不真正独立存在。

(b)设计的早期优化通常是一个错误 - 如果0.01%的概率恰好出现,那么以后重构就很容易了。


不要为小东西出汗

你显然已经考虑过了,所以你的直觉就是这样。

答案 3 :(得分:0)

我将一些功能拆分为一个单独的类的唯一原因是,当这一大块功能可以重复使用时,你可以消除其他地方的重复,并且你可以得到一个支持这两种用途的良好干净的界面。否则,您可能会冒险引入维护人员难以使用的高度耦合对象。

答案 4 :(得分:0)

既然你说B中的功能非常重要,那么它可能需要它自己的类。然后你可以把B作为A的一部分(像Mark建议的那样继承组合)。这可能还允许您更轻松地测试B中的功能而无需创建A.当然,这取决于B中的方法使用/滥用A中的数据/方法的程度。也许这些数据/方法更适合也进入B.如果B没有将自己的重量作为一个单独的类别,那么我会保持原样。

答案 5 :(得分:0)

从设计的角度来看,没有一个班级比另一个班级更重要或更重要。重要的是您设计的编程系统如何准确地映射真实系统。例如,如果你想在格斗游戏中对人体进行编程,你想要编程的人体的任何部分应该是一个单独的类(例如,不是因为指甲从不在战斗中使用,它是一个不重要的类,假设你想要一个指甲类)。当然,一个类可以包含另一个类(即,一个类是另一个类的实例),那些提供infrustrure的函数方法可以在Util类中实现(即,Debug类包含与调试相关的方法)。

精确映射真实系统的设计不仅提供了编程优势,还提供了灵活性和可扩展性等架构优势。

答案 6 :(得分:0)

anwser不是。

要完成这种类型的代码分离,开发人员应该使用class,struct或interface的partial关键字,并将它们存储在单独的文件中。

A_logic.class

public partial class A
{
    public A() { }

    //a lot of stuff...
}

A_staff.class

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

从.NET 3.0开始,也可以创建部分方法。

A_logic.class

public abstract class A
{
    public A() { }

    partial void DoSomethingUsingFoo();
    partial void DoSomethingElseUsingFoo();


    //a lot of stuff...
}

A_staff.class

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