0

我有 3 个这样的课程:

class MainClass
{
   public Status status1;
   public Control control1;
}

class Status
{
   MainClass mainClass;
   public void testStatus()
   {
      mainClass.control1.testControl();
   }
}

class Control
{
   public void testControl()
   {
   }
}

我不知道“mainClass.control1.testControl()”这行在 OOP 世界中是正确的工作还是肮脏的工作。如果这种情况不好,有什么解决方案。

4

5 回答 5

2

我会说这真的没有意义。MainClass对两者都有引用,Control因此Status它似乎是最合乎逻辑的控制器对象。但是,您没有明确说明这些类中的每一个如何相互关联,因此那里没有太多可做的事情......

如果依赖Status那么控制应该显式传递,即Control

public class Status
{
    private Control control;

    public Status(Control control)
    {
        this.control = control;
    }

    public void testStatus()
    {
        this.control.TestControl();
    }
}

此外,假设MainClass引用Status应该是它的父级,您也需要将其传递进去。但是,如果它的唯一目的是调用TestControl,那么这里根本不需要它。

于 2013-10-17T10:25:45.760 回答
0

问题中发布的示例代码并没有真正遵循“高内聚和低耦合”的OO原则。Status尝试以不需要知识的方式重新思考解决方案Control。考虑查看设计模式(如“观察者”模式)。

于 2013-10-17T10:36:02.433 回答
0

是的,我发现了一些问题,

  1. 存在循环依赖 b/w Main 和 Status。
  2. 责任未妥善处理

您的 Main 类拥有与 Status 和 Control 的关联。从代码中我的理解是,Status 是一个检查任何给定控件的类,但不与任何特定控件相关联,因此那里存在弱关联..

在这种情况下,我发现将控件传递给状态会更好。状态 testStatus 方法获取要测试的控件的参数并检查返回状态。下面是代码

#1

class MainClass
{
    public Status status1;
    public Control control1;
}

class Status
{        
    public void testStatus(Control control)
    {
        control.testControl();
    }
}

class Control
{
    public void testControl()
    {
    }
}

如果需要更紧密的耦合,您可以将 Status 作为属性添加到 Control。这种方式 Main 仅与 Control 相关联,后者在需要时返回 Status。职责分工明确。

#2

class MainClass
{
    Control control1;

    public void TestMethod()
    {
        control1 = new Control();
        Status control1Status = control1.GetStatus();
    }

}

class Status
{
    public Status(Control control)
    {
        //do status Initiation
        IsValid = true //or false
    }

    public bool IsValid
    {
        get;
        private set;
    }
}

class Control
{
    public Status GetStatus()
    {
        return new Status(this);
    }
}

#2更好

于 2013-10-17T10:37:11.747 回答
0

您在这里没有提供太多信息,但是您怀疑您拥有的代码不是很好是正确的。原因是耦合。您正在使您的类严重依赖彼此并在它们之间进行交叉引用,这很糟糕。

我建议使用接口来解决这个问题,类似于:

public interface IStatus
{
    void TestStatus();
}

public interface Control
{
    void testControl();
}

public interface IMainClass {}

internal class MainClass : IMainClass
{
    public IStatus status1;
    public IControl control1;
}

internal class Status : IStatus
{
    public IMainClass mainClass;

    public void testStatus()
    {
        mainClass.control1.testControl();
    }
}

internal class Control : IControl
{
    public void testControl()
    {
    }
}
于 2013-10-17T10:37:59.033 回答
0

这实际上取决于您要限制对同级控件的访问的程度。

也许有一种方法可以获取您要测试的控件的索引?

bool TestControl(int index)
{
    return controls[0].TestControl();
}
于 2013-10-17T10:23:04.420 回答