实现具有不同成员名的接口
本文关键字:接口 成员 实现 | 更新日期: 2023-09-27 18:03:48
我有IPrice接口:
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; }
}
我有接口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, deliverynotes,每个:1. 使用IPrice的成员实现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的实现相同。不同之处在于它的名称而不是credit - debit/debt。
在不更改CreditInvoice成员名称的情况下使用ExtendPrice的最佳实践是什么?
为该成员使用显式接口实现:
class CreditInvoice : IExtendPrice
{
// ...
public decimal TotalCreditSumWithoutTax { /* ... */ }
// Only seen when accessing an instance by its IExtendPrice interface
decimal IExtendPrice.TotalDebtWithoutTax {
get { return TotalCreditSumWithoutTax; }
}
}
你必须这样做:
public decimal TotalDebtWithoutTax { get { return TotalCreditSumWithoutTax; } }
虽然当你读到这一点时,听起来好像你的代码中有一些设计缺陷。
在注释中,您明确表示要实现接口,但不实现名为TotalDebtWithoutTax
的方法。那不可能。为了实现一个接口,你需要实现所有的方法。
我猜你为TotalDebtWithoutTax
选择的名字太限制了。您可能会反对使用方法名称TotalCreditSumWithoutTax
来实现它。贷方怎么能变成借方呢?我猜你需要泛化底层接口来消除这个阻抗。
您正在寻找适配器模式。这将创建一个实现接口的适配器,然后调用已适应类型的现有方法。