【发布时间】:2012-09-01 18:45:57
【问题描述】:
当你读到这篇文章时,你会非常想给出这样的建议:“这是一个坏主意,原因如下......”
忍受我。我知道还有其他方法可以解决这个问题。这个问题应该被认为是琐事。
假设您有一个“交易”类,它具有所有交易共同的属性,例如发票、采购订单和销售收据。
让我们以交易“金额”为例,它是给定交易中最重要的货币金额。
public class Transaction
{
public double Amount { get; set; }
public TxnTypeEnum TransactionType { get; set; }
}
这个金额在派生类型中可能有一个更具体的名称……至少在现实世界中是这样。比如下面的值其实都是一样的:
- 交易 - 金额
- 发票 - 小计
- 采购订单 - 总计
- 销售收据 - 金额
所以现在我想要一个派生类“发票”,它有一个小计而不是一般命名的金额。理想情况下,以下两种情况都是正确的:
- 在 Transaction 实例中,Amount 属性是可见的。
- 在 Invoice 实例中,Amount 属性将被隐藏,但 Subtotal 属性将在内部引用它。
发票如下所示:
public class Invoice : Transaction
{
new private double? Amount
{
get
{
return base.Amount;
}
set
{
base.Amount = value;
}
}
// This property should hide the generic property "Amount" on Transaction
public double? SubTotal
{
get
{
return Amount;
}
set
{
Amount = value;
}
}
public double RemainingBalance { get; set; }
}
当然,Transaction.Amount 在任何 Invoice 实例上仍然可见。
感谢观看!
【问题讨论】:
-
还强烈建议使用小数作为金额类型而不是双精度。
标签: c# properties alias derived-class base-class