我有 IPrice 接口(interface):
public interface IPrice
{
decimal TaxPercent { get; set; }
decimal TotalDebt { get; set; }
decimal Discount { get; set; }
DiscountTypeEnum DiscountType { get; set; }
decimal Commission { get; set; }
DiscountTypeEnum CommissionType { get; set; }
}
我有接口(interface) IExtendPrice 及其默认实现:
public interface IExtendPrice
{
decimal TotalDebtWithoutTax { get; }
decimal TaxSum { get; }
decimal DiscountSum { get; }
decimal CommissionSum { get; }
decimal DebitPrice { get; }
}
public class ExtendPrice : IExtendPrice
{
private IPrice m_Price = null;
public ExtendPrice(IPrice price)
{
m_Price = price;
}
public decimal TotalDebtWithoutTax { get { return (m_Price.TotalDebt / (1 + (m_Price.TaxPercent / 100))); } }
public decimal TaxSum { get { return m_Price.TotalDebt - TotalDebtWithoutTax; } }
public decimal DiscountSum
{
get
{
decimal discount = m_Price.Discount;
if (m_Price.DiscountType == DiscountTypeEnum.PERCENTS)
{
discount = discount * NetoPrice / 100;
}
return discount;
}
}
public decimal CommissionSum
{
get
{
decimal commission = m_Price.Commission;
if (m_Price.CommissionType == DiscountTypeEnum.PERCENTS)
{
commission = commission * NetoPrice / 100;
}
return commission;
}
}
public decimal NetoPrice { get { return CalculateNetoPrice(); } }
private decimal CalculateNetoPrice()
{
decimal debitPrice = 0;
if (m_Price.DiscountType == DiscountTypeEnum.COINS &&
m_Price.CommissionType == DiscountTypeEnum.COINS)
{
//TotalDebtWithoutTax=X-Discount+Commission
debitPrice = TotalDebtWithoutTax + m_Price.Discount - m_Price.Commission;
}
else if (m_Price.DiscountType == DiscountTypeEnum.COINS &&
m_Price.CommissionType == DiscountTypeEnum.PERCENTS)
{
//TotalDebtWithoutTax=X-Discount+Commission*X/100
debitPrice = (TotalDebtWithoutTax + m_Price.Discount) / (1 + m_Price.Commission / 100);
}
else if (m_Price.DiscountType == DiscountTypeEnum.PERCENTS &&
m_Price.CommissionType == DiscountTypeEnum.COINS)
{
//TotalDebtWithoutTax=X-Discount*X/100+Commission
debitPrice = (TotalDebtWithoutTax - m_Price.Commission) / (1 - m_Price.Discount / 100);
}
else if (m_Price.DiscountType == DiscountTypeEnum.PERCENTS &&
m_Price.CommissionType == DiscountTypeEnum.PERCENTS)
{
//TotalDebtWithoutTax=X-Discount*X/100+Commission*X/100
debitPrice = TotalDebtWithoutTax / (1 - m_Price.Discount / 100 + m_Price.Commission / 100);
}
return debitPrice;
}
}
我有 Invoice、PurchaseInvoice、DeliveryNote 等类,每个类: 1. 使用其成员实现 IPrice。 2. 使用 ExtendPrice 默认实现实现 IExtendPrice。 这样的类看起来像:
public class Invoice : IPrice, IExtendPrice
{
public virtual decimal TotalDebt { get; set; }
public virtual decimal TaxPercent { get; set; }
public virtual decimal Discount { get; set; }
public virtual DiscountTypeEnum DiscountType { get; set; }
public virtual decimal Commission { get; set; }
public virtual DiscountTypeEnum CommissionType { get; set; }
private IExtendPrice extendPrice = null;
public Invoice()
{
extendPrice = new ExtendPrice(this);
}
public decimal TotalDebtWithoutTax { get { return extendPrice.TotalDebtWithoutTax; } }
public decimal TaxSum { get { return extendPrice.TaxSum; } }
public decimal DiscountSum { get { return extendPrice.DiscountSum; } }
public decimal CommissionSum { get { return extendPrice.CommissionSum; } }
public decimal DebitPrice { get { return extendPrice.DebitPrice; } }
}
但是我没有名为 CreditInvoice 的类。它有以下成员:
public decimal TotalCreditSumWithoutTax
{
get { return Math.Round(m_TotalCreditSum / (1 + (m_Tax / 100)), 2); }
}
这与 ExtendPrice 的 TotalDebtWithoutTax 实现相同。不同之处在于它的名称而不是贷方 - 借方/债务。
在不更改其成员名称的情况下在 CreditInvoice 中启用 ExtendPrice 的最佳做法是什么?
最佳答案
使用 explicit interface implementation对于该成员:
class CreditInvoice : IExtendPrice
{
// ...
public decimal TotalCreditSumWithoutTax { /* ... */ }
// Only seen when accessing an instance by its IExtendPrice interface
decimal IExtendPrice.TotalDebtWithoutTax {
get { return TotalCreditSumWithoutTax; }
}
}
关于c# - 实现一个接口(interface)但具有不同的成员名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6846557/