允许两个子类实例访问彼此的方法
本文关键字:方法 访问 许两个 子类 实例 | 更新日期: 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
的引用,因此它似乎是最合乎逻辑的控制器对象。但是,您没有明确指出这些类中的每一个如何相互关联,因此没有太多内容可讲......
如果Status
在Control
上是偏离的,那么控制应该明确传递,即
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()
{
}
}
是的,我发现了一些问题,
- 有循环依赖黑白主和状态。
- 责任处理不当
您的主类同时与"状态"和"控制"相关联。从代码中我的理解是,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