Czy jeśli tworzę klasę Samochód to np obiekt typu koło zadeklarować go jako kompozycję a stworzyć go po przez wstrzykiwanie zależności ? Tak to się robi według prawidłowych technik programowania obiektowego ?
To zależy co w ten sposób chcesz zamodelować. Inaczej będzie w grze, inaczej w systemie sprzedaży.
Możesz to rozwinąć ? Chodzi mi o przykład jaki podałem w pierwszym poście.
Takie obiekty najlepiej tworzyć w taki sposób, żeby posługiwać się tylko interfejsami. Także masz w klasie samochód coś takiego:
class Car
{
List<IWheel> wheels = new List<IWheel>();
}
Tutaj założyłem, że koła trzymasz w liście.
Najlepiej jest tworzyć takie koła za pomocą konstruktora. W taki sposób:
public Car(List<IWheel> wheels)
{
foreach(IWheel w in wheels)
this.wheels.Add(w);
}
Jest to rozwiązanie idealne z punktu widzenia prawidłowych technik programowania obiektowego. Dzięki temu Twoja klasa Car nie jest w ogóle zależna od jakiejkolwiek implementacji innych klas. W tym np. fabryki kół:
public Car()
{
this.wheels = WheelFactory.Instance.CreateWheels(4, CarWheel);
}
W tym przypadku Twoja klasa jest zależna od fabryki - czyli pojawia się zależność z inną klasą. To jest częsty błąd przy projektowaniu DI.
Dlatego pomysł z kołami przekazywanymi w konstruktorze jest idealny z punktu widzenia techniki programowania obiektowego - czyli to, o co pytasz.
Natomiast zapewne istnieją sytuacje, w których taki sposób tworzenia (parametry w konstruktorze) nie będzie idealny dla danego rozwiązania.