我在抽象类中有这个属性
private int m_base_salary;
abstract public int BaseSalary
{ get; set; }
在派生类中我有
private int m_base_salary;
public override int BaseSalary
{
get { return m_base_salary; }
set
{
if(value < MinSalary)
throw new ArgumentOutOfRangeException();
m_base_salary = value;
}
}
当我编译时,我在基类上得到一个警告,说明从未使用字段m_base_salary,这是可以理解的,因为它是双重声明的,并且从未在基类中使用过。如果我没有在派生类中声明该字段,则会收到一条错误消息,指出由于其保护级别而无法访问该字段。一种可能的解决方案是将它仅在基类中声明为内部,但它将被暴露。另一种解决方案只在派生类中声明它,通过这样做我失去继承,我需要继承该字段,并且如你所知,我不能在接口中声明字段。
对此有什么好的解决方案?
P.S m_base_salary是int,因为该程序旨在用于货币由千位给出而没有小数点的国家,我不需要浮动类型
答案 0 :(得分:0)
将字段声明为protected
而不是private
。这意味着它可以从派生类访问,但不能从不相关的类访问。
但是,正如@Jon Skeet所说,在这种情况下没有理由这样做,这是错误的。
BaseSalary
并创建m_base_salary
字段(然后再将该类派生出来)。 BaseSalary
不应该是抽象的(如果某些类必须改变其实现,它可能是虚拟的)。我认为这将是一个更好的解决方案(虽然我不知道设计要求)。但是创建一个抽象属性,以及该属性的后置字段,只在派生的类中实现是错误的。