zrob sobie np. interfejs ITransactionExecutor, ktory implementuja Person i Company
do obiektu Transaction przekaz obiekt implementujacy ITransactionExecutor
interface ITransactionExecutor {...}
class Person : ITransactionExecutor {...}
class Company : ITransactionExecutor {...}
class Transaction
{
public Transaction(ITransactionExecutor trExec) {...}
}
program
Person p1 = new Person(...);
var tran1 = new Transaction(p1);
inny scenariusz to:
Person i Company implementuja interfejs z metoda Transaction PrepareTransaction(...)
obiekt, ktory ta metoda zwroci uzywasz, np. wywolujesz na nim jakies Execute()
kolejny podobny sceneriusz robisz klase typu factory, ktora w zaleznosci od wykonawcy (person/company) zwroci odpowiedni obiekt transakcji
kolejny to mozesz miec interfejs typu ITransaction i dwie implementacje TransactionPerson i TransactionCompany, a interfejs bedzie definiowal jakies metody: Init, Execute etc.
wszystko zalezy jak bardzo realizacja transakcji rozni sie w zaleznosci od wykonawcy
a) jesli bardzo - stawiam na ostatni scenariusz
b) jesli roznic wystepuje tylko w tym jakie pola z person/company przypisac do jakis pol transakcji, to scenariusz pierwszy bedzie wystarczajacy