Nao*_*aor 7 .net c# design-patterns
我有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; }
}
Run Code Online (Sandbox Code Playgroud)
我有接口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;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些类,如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; } }
}
Run Code Online (Sandbox Code Playgroud)
但是,我有一个名为CreditInvoice的课程.它有以下成员:
public decimal TotalCreditSumWithoutTax
{
get { return Math.Round(m_TotalCreditSum / (1 + (m_Tax / 100)), 2); }
}
Run Code Online (Sandbox Code Playgroud)
这与ExtendPrice的TotalDebtWithoutTax相同.区别在于它的名称而不是信用 - 借方/债务.
在CreditInvoice中使用ExtendPrice而不更改其成员名称的最佳做法是什么?
Cam*_*ron 15
对该成员使用显式接口实现:
class CreditInvoice : IExtendPrice
{
// ...
public decimal TotalCreditSumWithoutTax { /* ... */ }
// Only seen when accessing an instance by its IExtendPrice interface
decimal IExtendPrice.TotalDebtWithoutTax {
get { return TotalCreditSumWithoutTax; }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4101 次 |
| 最近记录: |