我有一个依赖于其他一些属性的属性,代码如下所示:
get
{
if (this.FuelType == "Benzin")
{
if (this.KmPrL >= 18)
{
return 'A';
}
else if (this.KmPrL < 18 && this.KmPrL >= 14)
{
return 'B';
}
else if (this.KmPrL < 14 && this.KmPrL >= 10)
{
return 'C';
}
else
{
return 'D';
}
}
}
现在我有另一个类覆盖了这个get,我希望它使用这个get调用,但是KmPrL值乘以0.7,但是没有实际修改属性KmPrL。 我该怎么做呢?
答案 0 :(得分:0)
我会做一些重构来实现这一点,将你对this.KmPrL
的使用重构为这样的虚拟方法:
protected virtual GetKmPrL() //Or a more descriptive name
{
return KmPrL
}
...
if (this.FuelType == "Benzin")
{
if (GetKmPrL() >= 18)
{
然后你的派生类可以覆盖它:
protected override GetKmPrL()
{
return KmPrL * .7
}
总的来说,你的getter属性看起来有点复杂,但是通过允许派生类覆盖你的依赖属性的计算,你将获得你正在寻找的行为。
答案 1 :(得分:0)
我会更改你的属性getter以在支票中使用你的因子。然后在覆盖中提供因子为0.7。
public virtual char FuelRating
{
get
{
return CalculateRating(this.FuelType, this.KmPrL, 1.0);
}
}
internal char CalculateRating(string fuelType, double kmprl, double factor)
{
double x = kmprl * factor;
if (this.FuelType == "Benzin")
{
if (x >= 18)
{
return 'A';
}
else if (x < 18 && x >= 14)
{
return 'B';
}
else if (x < 14 && x >= 10)
{
return 'C';
}
else
{
return 'D';
}
}
else
return char.MinValue; // not clear what is expected for other fuel types.
}
然后在你的派生类中你会得到:
public override char FuelRating
{
get
{
return CalculateRating(this.FuelType, this.KmPrL, 0.7);
}
}
最后,另外,您应该小心在属性getter中执行复杂的逻辑。属性应该是轻量级的,如果其中有昂贵的操作,则可能会遇到性能问题。