【问题标题】:Proper way to inherit fields from a Base Class?从基类继承字段的正确方法?
【发布时间】:2014-12-19 16:33:56
【问题描述】:

下面的代码是否足够好,还是应该使用接口或抽象类之类的东西?

我有一些通用代码,但我没有看到抽象类或接口的原因。

此外,如果不探索或悬停在它上面,就无法判断 serviceClient 来自 BaseTask。每个 Task1 和 Task2 中是否有东西表明这一点?

public class BaseTask
{
    private string configValue1 = "abc";
    private string configValue2 = "def";

    public ServiceClient serviceClient = new ServiceClient(configValue1,configValue2);
}

public class Task1 : BaseTask
{
    public void RunTask()
    {
        serviceClient.RunTask1();
    }

}

public class Task2 : BaseTask
{
    public void RunTask()
    {
        serviceClient.RunTask2();
    }

}

public class BaseTask
{
    private readonly string configValue1 = "abc";
    private readonly string configValue2 = "def";

    private readonly ServiceClient serviceClient = new ServiceClient(configValue1,configValue2);

    public ServiceClient ServiceClient { get{ return serviceClient;} }
}

public class Task1 : BaseTask
{
    public void RunTask()
    {
        ServiceClient.RunTask1();
    }

}

public class Task2 : BaseTask
{
    public void RunTask()
    {
        ServiceClient.RunTask2();
    }

}

【问题讨论】:

  • @Habib - 抱歉,我会将其更改为单词字段。只是混淆了我的条件。

标签: c# inheritance base-class


【解决方案1】:

从架构上讲,我只会将serviceClient 设为只读属性。从风格上讲,我会遵循 .NET 的正确大小写约定:

private ServiceClient serviceClient = new ServiceClient(configValue1,configValue2);

public ServiceClient ServiceClient
{
    get { return serviceClient; }
} 

RunTask 设为虚拟也可能有意义,因为您显示的实现是相同的(如果需要,它允许您在其他实现中覆盖它):

public virtual void RunTask()
{
    serviceClient.RunTask1();
}

【讨论】:

  • 我做了你建议的改变,但是我怎样才能更明确地调用ServiceClient.RunTask1(),所以如果有人在看代码,他们可以很快看出ServiceClient来自BaseTask ,类似于BaseTask.ServiceClient.RunTask1()
  • 您可以使用base.serviceClient 表示来自基类。
【解决方案2】:

如果单独创建BaseTask 的实例没有意义,则将其抽象化以防止任何人这样做。这也使您的意图明确(即,BaseTask 应该只派生自)。

我还建议不要公开变量。而是将它们隐藏在属性后面。

【讨论】:

  • 关于抽象的好点。我的实际变量是私有的,除了我在另一个类中使用的 1。
  • 我实际上现在将它们全部更改为私有并使用了 D Stanley 指出的公共属性,所以我的 Task1 类中有类似 ServiceClient.RunTask1() 的东西,但是有没有办法让调用更明确,比如BaseTask.ServiceClient.RunTask1()这样就更清楚了?
  • @xaisoft - 我不认为让它更明确(通过写BaseTask.ServiceClient.RunTask1())是一个好主意,因为它将实现暴露给类的用户。在派生类(在基类上)有一个RunTask 方法会更干净。
【解决方案3】:

您目前没有任何属性。如果您需要特定值,请尝试以下操作。

public class BaseTask
{
  private string _configValue1 = "abc";
  private string _configValue2 = "def";
  private ServiceClient _serviceClient1 = new ServiceClient(configValue1,configValue2);

  Public ServiceClient ServiceClient1
   {
    get
     {
        return _serviceClient1;
     }
   set
     {
        serviceClient1 = value;
     }  
 }

Public string ConfigValue1
 {
   get
     {
        return _configValue1;
     }
   set
     {
        _configValue1= value;
     }
 }

Public string ConfigValue2
 {
   get
     {
        return _configValue2;
     }
   set
     {
        _configValue2 = value;
     }
 }

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多