【问题标题】:Conditional selection from two different objects with same members从具有相同成员的两个不同对象中进行条件选择
【发布时间】:2014-03-11 14:46:51
【问题描述】:

我想要做的最好用一些代码来解释:

这里我有两个类(更准确地说是数据集中的 DataTables,但我宁愿将其描述为类符号):

    class A {
       public aType varA;
       public bType varB;
       public cType varC;
    }

    class B {
       public aType varA;
       public bType varB;
       public cType varC;
       public dType varD;
    }

这些表是由一个名为varSelect的变量定义的:

    A varnameA = (varSelect == 1) ? ABuilder() : null;
    B varnameB = (varSelect == 2) ? BBuilder() : null;

在代码中我必须使用类似的东西:

   if((varSelect == 1 && varnameA.varA == true) || 
      (varSelect == 2 && varnameB.varA == true)
   { 
       ... 
   }

如您所见,它做同样的事情,但它们有一些不同的属性,但我将主要使用相同的类成员进行检查。我怎么能设计出这样的东西?

注意:认为 B 是 A 类的较新版本。但某些代码将不得不继续使用 A 作为其数据源。

【问题讨论】:

  • 只要您有一组有限已知的具体类需要以多态方式访问,Visitor pattern 就很有帮助。
  • 我尝试连接这两个元素,直到我意识到它们实际上是不同数据集的数据表。
  • 现在正在寻找并尝试了解访问者模式。
  • 不,使用dynamic 类型变量更容易。

标签: c# design-patterns


【解决方案1】:

封装和继承可以帮助解决这个问题。

class Data {
    // Common properties
    public aType varA;
    public bType varB;
    public cType varC;
}

class A extends Data {
    // other properties
}

class B extends Data {
    public dType varD;
    // other properties
}

class DataTable {
    Data data;
    public DataTable(int selector) {
        if (selector == 1) {
            // data will contain table A
        } else if (selector == 2) {
            // data will contain table B
        }
    }

    public boolean isVarA() {
        return data.varA;
    }
}

所以当我们需要检查varA时,我们不再需要记住选择了哪个数据表。

DataTable dataTable = new DataTable(1); // varSelect = 1
//...
//...
//...
if (dataTable.isVarA() == true) {
    // do something
}

【讨论】:

  • 是的,我想过,但是我的设计不兼容扩展和覆盖,也不适合重写,所以我写了一个包含类型和返回的包装类选择性对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多