2010-09-29 10 views
0

моего приложения имеет следующую структуру:Родителя/Архитектура для детей Выпуск

public class Transaction 
{ 
    public int TransactionID { get; set; } 
    public TransactionTypes Type { get; set; } // Enum for the type of transaction 
    public decimal Amount { get; set; } 
    public virtual decimal GrandTotal { get; set; } // In this case this would simply be the Amount 
} 

public class MembershipTransaction : Transaction 
{ 
    public decimal ExtraAmount { get; set; } 
    public override decimal GrandTotal { get { return base.GrandTotal + ExtraAmount; } } 
} 

мне было интересно ли GrandTotal против сделки должен включать ExtraAmount автоматически. Преимущества этого в том, что, если я получу все транзакции, показатель GrandTotal будет правильным, независимо от типа транзакции. С приведенной выше логикой я в настоящее время должен переключать каждый тип транзакции и возвращать GrandTotal для производного типа.

Я был бы признателен, если бы кто-то мог прояснить это для меня. Спасибо

ответ

2

A Grand Total - это Grand Total, и в этом качестве было бы разумно, если бы оно включало ExtraAmount. Это также имеет смысл в контексте, что код может требовать только знания о базовом классе Transaction для получения правильного значения GrandTotal.

В качестве побочного примечания; Какая цель имеет перечисление TransactionTypes? Недостаточно ли проверить тип самого объекта транзакции?

+0

Отлично, это то, чего я ожидал, но хорошо иметь больше уверенности. Я делаю все правильно. Модель на самом деле является абстракцией из моей базы данных, поэтому мне нужно перечислить. – nfplee

2

Я бы рекомендовал вам включить его в базу, чтобы вы могли использовать интерфейс/абстрактный класс.

Каждый тип транзакции должен знать, как рассчитать собственную дополнительную сумму (равную нулю, процент от суммы, фиксированные скобки), так что бизнес-логика находится в классе, переопределяющем базовый/абстрактный класс.

Это позволит вам использовать общую сумму, не зная, каков фактический тип транзакции.

1

Наличие дополнительной суммы как части класса наследования и преодоления Великого Всего нарушит Принцип замены Лискова, насколько мне известно. ExtraAmount и расчет для GrandTotal должны быть включены в ваш базовый класс.

Надеюсь, что это поможет.

Смежные вопросы