在课堂之间委派 - 最佳实践

时间:2011-12-19 23:16:23

标签: c# ooad

我的C#组件有一个类如下:

    namespace SharedComponent{
       class TestResult {
           //several members
       }
    }

在另一个现有的C#应用​​程序中,我引用了这个组件,我需要实例化这个相同的类,但是有一个额外的标识符,如下所示。

    namespace ClientApplication {
      class TestResult 
      { 
             //exact same members as above including methods
             //actually the shared component class was created by gleaming 
             //that from this application!
             int PersonID; //additional identifier
                  //not suitable to have in the shared component
      }
  }

在客户端应用程序中,有几种方法依赖于附加标识符。因此,模仿复制构造函数并创建此对象并填写其他参数非常诱人。这样我可以使用现有的函数,只需对类进行最小的更改。

另一种方法是将其余细节添加为客户端实现的参考。

 namespace ClientApplication {
     class TestResult {
      SharedComponent.TestResult trshared = new SharedComponent.TestResult()
       //but this warrants I have my class methods to delegate 
       //to the sharedcomponent throughout ; example below

      internal bool IsFollowUp(ClientApplication.TestResult prevTest)
      {
        //a similar method is being used
                //where a function takes the class object as parameter
                trshared.IsFollowUp(prevTest.trshared);
      }

      int PersonID; //additional identifier

   }
}

哪个选项更好?这方面的最佳做法是什么?

环境:VS2008,C#,WinXP / Win7

1 个答案:

答案 0 :(得分:2)

听起来像我的ClientApplication.TestResult“是一个”SharedComponent.TestResult。假设SharedComponent.TestResult未被密封,您可以从该类扩展。这样您就不必复制粘贴代码。如果您还能够修改SharedComponent.TestResult,那么您可以将方法声明为虚拟,并在ClientApplication.TestResult中覆盖它们的行为。

class TestResult : SharedComponent.TestResult
{
    int PersonId { get; set; }

    override bool IsFollowUp(ClientApplication.TestResult prevTest)
    {
          // Your own implementation or trivial (base.IsFollowUp(ClientApplication.TestResult.prevTest.trShared)
    }
}

如果您无法在SharedComponent.TestResult中将方法更改为虚拟,则可以在派生类中使用关键字“new”。