【问题标题】:property inheritance without valuing joint财产继承不重视联合
【发布时间】:2015-01-16 18:12:46
【问题描述】:

我想使用接口或抽象类继承2个类中相同的一些属性;我不想在子类中声明变量。

可以这样做吗?

父类:

interface IError
{
    DateTime GETDATE { get; set; }
    string ERROR_NUMBER { get; set; }
    string ERROR_SEVERITY { get; set; }
    string ERROR_STATE { get; set; }
    string ERROR_PROCEDURE { get; set; }
    string ERROR_LINE { get; set; }
    string ERROR_MESSAGE { get; set; }
}

孩子:

public class Business
{
    public Business()
    {
        this.Id = -1;
        this.Message = "";
    }
    public int Id { get; set; }
    public string Message { get; set; }
}

另一个孩子:

public class DbTools
{
  //Another Class

}

我需要这两个类的父属性,但是如果像下面这样更改代码,我应该使用另一个我不想使用的变量:

public class Business : IError
{
    private DateTime m_GetDATE;//I don't want to declare another variable
    public DateTime GETDATE
    {
        get { return m_GetDATE; }
        set { GETDATE = m_GetDATE; }
    }
}

【问题讨论】:

  • 很不清楚你在问什么。也许是一个代码模拟了你不想做什么的想法,并更多地解释了你想做的事情。
  • @paqogomez ,我更改了我的代码,把它拿出来等待。
  • 我已投票决定重新开放。到目前为止,它获得了 3 票,并且可能会找到其他人。至于你的问题。你没有用m_GetDATE 做任何特别的事情,为什么不直接使用auto-implemented property,比如public DateTime GETDATE{get;set;} public string ERROR_NUMBER{get;set;}?您可以对所有属性执行此操作,而无需任何支持字段。
  • 我不想在两个子类中重复这个属性,我想在父类中声明这些属性,并从父类继承两个子类。
  • 如果我理解正确,您需要一个基类public class ErrorBase: IError 来实现所有属性。然后您的子类public class Business: ErrorBasepublic class DbTools:ErrorBase 会从它继承,并会自动获取所有已实现的属性。

标签: c# inheritance properties


【解决方案1】:

听起来你想要一个abstract 基类:

public abstract class ErrorBase : IError
{
     public DateTime GETDATE { get; set; }
     //...ditto all the other IError properties
}

那么你可以继承它:

public class Business : ErrorBase
{
    // all the ErrorBase properties are inherited
}

您也可以将基类属性设置为virtual,以防万一您需要在派生类中随时使用override

您可能会考虑的另一件事是组合而不是继承。 BusinessDbTools 应该从同一个基类继承似乎并不那么自然,因此应该有一个(非抽象)ErrorBase 类实现 IError 并具有 Business 和 @ 987654331@ 有一个Error 属性:

public class ErrorBase : IError
{
     public DateTime GETDATE { get; set; }
     //...ditto all the other IError properties
}

public interface IHaveError
{
    ErrorBase Error { get; set; }
}

public class Business : IHaveError
{
    public ErrorBase { get; set; }
}

作为奖励,您可以使 IHaveError 实际上是 IHaveErrors 并拥有一个 List<ErrorBase> 属性,允许您的对象包含多个错误,这有时可能很有用。

【讨论】:

  • 很好的答案,正是我所设想的。也喜欢错误属性的想法。
  • 但现在看来 OP 已经删除了他的帐户。太糟糕了。
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 2013-02-01
  • 2023-03-08
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多