polimorfizm

0

Czesc,

mam dwie klasy
"Person (Imie,Nzwisko,DataUr,ImieOjca,ImieMatki,Adres1,Adres2,Telefon,Pesel,Email)"
i
"Firma(Nazwa,Nip,Adres,Telefon,Regon,KRS,Konto,email,www,logo)".

Kazdy z tych objektow moze wykonywac pewna operacje, operacje sa reprezentowane przez objekt Transaction (Date, Objekt ktory wykonal tranzakcje (Person lub Firm) ).
Jak zaprojektowac objekt Person i Firma, zeby wszystkie operacje mogly zostac obsluzone przez jeden <ort>objekt </ort>Transaction.

pozdro

0

Niech mnie upomną koledzy jeśli się mylę, ale stwórz wspólny interfejs i pisz do interfejsu a w konstruktorze na przykład, jako parametr przepuszczaj instancje klasy która wykonuje transakcje.

1

@up ma rację:

Stwórz interfejs np. ITransatctionObj {} (pierwsza nazwa jaka mi przyszła do głowy), dodaj mu deklaracje funkcji potrzebnych do wykonania funkcji Transaction-a, a później zaimplementuj interfejs w klasach Person i Firma.

Później używaj metod transakcji tak:

Transaction.DoSth (ITransactionObj obj);
0

W Transaction mam property Objekt,
w pewnych przypadaka musze do tego property przypisac objekt typu Firma w innych obiekt typu Person.
Mam problem z realizacja tego.

Bylbym wdzieczny za jakis przyklad:)
pozdro

0

Ale z czym masz problem? Podawaj jako parametr konstruktora obiektu Transaction instancję obiektu który Ci jest potrzebny i przypisuj do właściwości Object. Co tutaj jest trudne?

Wydaje mi się, że po prostu Ci się nie chce.

0

czyli tak to ma wygladac:
public class Transaction
{
public Transaction(ITransatctionObj o)
{
date=DateTime.Now;
obj=o;
}
DateTime date
{
//..
}
Object obj
{
//..
}
}

ITransatctionObj<T>
{
T obj{get; set;}
}

class Firma: ITransatctionObj

class Person:ITransatctionObj

Teraz dostaje objekt X (Firma albo Person),
Transaction t = new Transaction(X);

0

Tak, ale kod wrzucaj w znaczniki kod, bo się go czytać nie da. Interfejs posiada definicje metod, które będą zarządzać Twoją aplikacją i pól, ale metody dostępu, hmn... Przecież one tylko automatyzują dostęp do pola.

0

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

0

czyli tak to ma wygladac:
public class Transaction
{
public Transaction(ITransatctionObj o)
{
date=DateTime.Now;
obj=o;
}
DateTime date
{
//..
}
Object obj
{
//..
}
}

ITransatctionObj<T>
{
T obj{get; set;}
}

class Firma: ITransatctionObj

class Person:ITransatctionObj

Teraz dostaje objekt X (Firma albo Person),
Transaction t = new Transaction(X);

Jesteś bardzo blisko, ale zamiast:

    Object obj
    {
        //..
    }

będzie:

ITransatctionObj obj { ... }

Poza tym typy generyczne są tu zbędne

1 użytkowników online, w tym zalogowanych: 0, gości: 1