Brakuje mi działu typu "Ogólne dyskusje o programowaniu" bo nie wiem gdzie o tym napisać - w "Newbie" temat zginie, w "Nietuzinkowe tematy" nikt nie zagląda, a "Inżynieria oprogramowania" się wręcz źle kojarzy.
Ale do rzeczy:
Często mi się zdarza że chciałbym wydzielić z kilku obiektów wspólną część do interfejsu, albo je sprowadzić do wspólnej klasy abstrakcyjnej.
Równie często nie mogę tego zrobić bo architektura aplikacji już jest narzucona przez kogoś "z góry" lub po prostu jest zabunkrowana w zewnętrznej dll-ce.
Prostym przykładem mogą być tu kontrolki DevExpressa gdzie wiele komponentów ma metody "BeginUpdate", "EndUpdate", ale nie są one z niczego dziedziczone - musiałbym więc każdą kontrolkę opakować w oddzielną klasę ze wspólnym interfejsem żeby móc z niego skorzystać. W innych przypadkach gdzie zwracana jest już klasa konkretnego typu wstrzyknięcie interfejsu może być nawet niemożliwe jeśli metody nie są wirtualne.
W praktyce zna się dużo wzorców ale nigdzie nie można z nich na niezaprojektowanym przez siebie projekcie skorzystać.
Zastanawiam się jakie by były minusy gdyby w językach silnie typowanych z podejścia "wszystko jest obiektem" przejść dalej na "wszystko jest interfejsem"
Na przykładzie języka C# klasa:
public class Class
{
public void A(int a)
{
// sth
}
public int B(string a)
{
// sth
}
}
mogłaby przecież automatycznie być interpretowana jako (słabo przemyślana składnia, ale chodzi o idee):
public class Class: IvoidAint, IintBstring
{
public void A(int a)
{
// sth
}
public int B(string a)
{
// sth
}
}
public interface IvoidAint
{
void A(int);
}
public interface IintBstring
{
int B(string);
}
dzięki czemu mógłbym użyć innej klasy, która zawiera identyczne metody, bez zmieniania tych klas
Oczywiście nazwy interfejsów i sposób "rzutowania" klas na te interfejsy byłyby do omówienia, ale ogólnie idea jest prosta
Można by było oczywiście tworzyć dalej własne interfejsy tak jak można to robić teraz
public interface IMojInterfejs
{
void A(int);
int B(string);
}
co byłoby po prostu tłumaczone na:
public interface IMojInterfejs : IvoidAint, IintBstring { }
wiem że akurat w C# są takie słówka jak "dynamic", ale to trochę odejście od silnego typowania i osobiście mi się nie podoba przez większą podatność na błędy.
Co sądzicie o tym pomyśle? Dlaczego nie ma czegoś takiego lub nic mi o tym nie wiadomo? A może w którymś języku już od dawna ta idea jest stosowana?