从基类继承字段的正确方法?

时间:2014-12-19 16:33:57

标签: c# inheritance base-class

下面的代码是否足够好,或者应该使用类似接口或抽象类的代码?

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

此外,没有办法告诉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();
    }

}

3 个答案:

答案 0 :(得分:2)

从架构上讲,我只会将serviceClient设为只读属性。从文体上来说,我会遵循.NET的正确套管约定:

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

public ServiceClient ServiceClient
{
    get { return serviceClient; }
} 

RunTask虚拟化也是有意义的,因为您显示的实现是相同的(并且它允许您在必要时在其他实现中覆盖它):

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

答案 1 :(得分:1)

如果单独创建BaseTask的实例没有意义,那么将其设为抽象以防止任何人这样做。这也使你的意图明确(即BaseTask只应来自)。

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

答案 2 :(得分:0)

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

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;
     }
 }