当组件无法从外部访问时如何处理类组合

本文关键字:处理 组合 何处理 组件 从外部 访问 | 更新日期: 2023-09-27 18:04:35

例如,如果我说我有三个类ABC,其中BCA有组合关系。这意味着BC的生命由A处理,而且B和C不能直接从外部进入。

出于某种原因,我的 DataService 类需要返回 BC 的对象,因为它不能返回A的对象作为B并且C不能同时初始化。(为了能够初始化C您必须先初始化B(。

因此,我从DataService返回DataTables,然后在类内部A这些数据表转换为B/C对象。

  1. 如果BC对象不能同时初始化,是否可以说BCA有组合关系?

  2. 如果它的成分是必须产生A,里面有BC

  3. 处理此类问题的正确方法是什么?

编辑:

下面的代码解释了我现在使用数据表的方式。

例:

class A   
{  
    private List<B> B;
    private List <C> C;
    public A()
    {
        B= new List<B>();
        C= new List<C>();
    }
    public List<B> GetB( DataTable dt) 
    {
        // Create a B list from dt
        return B;
    }
}

class Presenter
{
  private void Show B()
  {
    _View.DataGrid = A.GetB(DataService.GetAListOfB());
  }
}

实际场景是我有一个名为 WageInfo 的类和类EarningDeduction在设计中具有组合关系。但是要先生成Deductions您应该生成earnings并应保存在表中。然后,只有您可以为earnings生成deductions来计算余额工资。

另请注意,这些包含的类与包含的类 WageInformation 具有一对多关系。所以实际上WageInfo有一个List<Earnings>List<Deduction>

我最初的问题是,如果我的DataService类返回Deductions/Earnings对象(实际上是列表(而不是WageInfo

可以吗?

还不清楚?

当组件无法从外部访问时如何处理类组合

  1. 如果ABC,那么它就是一个组合,假设BC都不能自己"生活"。创建BC的时间不会在其中发挥作用。
  2. A不必为了使其成为一个组合而创建BC。这些可以在构建A时从外部提供给它,假设它们被赋予了适当的上下文。例如,如果BC需要对A的引用,那么创建它们的人需要提供A,或者当BC被添加到其中时,A可以取得所有权。
  3. 为了更轻松地处理此类问题,请为您希望在外部使用的BC部分创建接口。与类BC不同,接口必须能够独立存在,即在有或没有对象A上下文的情况下是有意义的。

#3 中的接口很重要,因为您的数据服务想要返回 BC 。在没有接口的情况下返回它们很有可能违反封装,因为大概BC的某些功能仅在A上下文中相关,而调用方缺少A的上下文。