Czytam książkę "Czysty kod" autorstwa Robert C. Martin a w niej znalazłem coś takiego(str. 114):
class Point
{
public double x,y;}
// jest gorsze niż:
interface Point
{
double GetX();
double GetY();
}
Argumentuje to tym, że ukrywa implementacje danych i nie sposób określić na jakich wew. operuje. Nie do końca to rozumiem.
Próbuje stworzyć klasę, interfejs, który będzie najlepiej reprezentować punkt w układzie kartezjańskim oraz da możliwość późniejszego rozszerzenia do punktu 3D lecz w układzie kartezjańskim będzie można operować na liczbach całkowitych i rzeczywistych. W konsoli potrzebuje tych pierwszych a w WPF drugich.
Tak więc wpadłem na pomysł zastosowania typów generycznych z wykorzystaniem interfejsu.
interface IPoint<T>
{
T X {get; }
T Y {get; }
// gdzie tutaj jest mowa o tym o czym mówi Pan Martin? O ukrywaniu implementacji? Jeżeli użyje właściwości a metod.
T GetX();
T GetY();
}
// A klasa
class Point : IPoint<int> // dla konsoli - potrzebuje możliwości operacji arytmetycznych na X i Y więc muszę podać typ :( Jak to obejść?
public int X {get; private set; }
// ...
public int GetX() // ..
Nie rozumiem jak tutaj stworzyć tą abstrakcje. Czy w ogóle będzie ona potrzebna? Jedyną klasą która implementuje IPoint jest Point może kiedyś będzie Point3D.
Ale chcę zrobić Point dla int i double a tworzenie klasy
class Point : IPoint<int> /* i osobno */ IPoint<double>
nie zadowala mnie. Jak zrobić by móc użyć operacji arytmetycznych na obiekcie T(w ogóle z tego korzystać?) w klasie Point.