允许两个子类实例访问彼此的方法

本文关键字:方法 访问 许两个 子类 实例 | 更新日期: 2023-09-27 18:35:49

>我有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世界中是正确的工作还是肮脏的工作。如果情况不好,有什么解决方案。

允许两个子类实例访问彼此的方法

我会

说这没有意义。 MainClass具有对Control/Status的引用,因此它似乎是最合乎逻辑的控制器对象。但是,您没有明确指出这些类中的每一个如何相互关联,因此没有太多内容可讲......

如果StatusControl上是偏离的,那么控制应该明确传递,即

public class Status
{
    private Control control;
    public Status(Control control)
    {
        this.control = control;
    }
    public void testStatus()
    {
        this.control.TestControl();
    }
}

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

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

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

bool TestControl(int index)
{
    return controls[0].TestControl();
}

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

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

我建议使用接口来解决这个问题,大致如下:

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()
    {
    }
}

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

  1. 有循环依赖黑白主和状态。
  2. 责任处理不当

您的主类同时与"状态"和"控制"相关联。从代码中我的理解是,Status是一个检查任何给定控件的类,但不与任何特定控件相关联,因此那里的关联很弱。

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

#1

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

如果需要更紧密的耦合,可以将状态作为属性添加到控件中。这样,Main 仅与在需要时返回状态的控件相关联。职责得到妥善理顺。

#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

更好