klasa abstrakcyjna C# implementująca interfejs
Widziałem następujący układ kodu czytający fora i inne posty na blogu i dostosowany do zadawania kilku pytań.
public interface IService<T>
{
int Add(T entity);
void Update(T entity);
}
public abstract class ServiceBase<T> : IService<T>
{
public int Add(T entity) { ... }
public void Update(T entity) { ... }
}
public interface ICarService : IService<Car>
{
}
public class SomeBaseClass : ServiceBase<Car>, ICarService
{
public int Add(Car entity);
public void Update(Car entity);
}
Nie rozumiem korzyści płynących z posiadania klasy abstrakcyjnej implmentującej interfejs. Dla mnie wydaje się to trochę powtarzalne i nie mogę zrozumieć korzyści płynących z posiadania abstrakcyjnej klasy implementującej interfejs.
- dlaczego klasa abstrakcyjna
ServiceBase<T>
po prostu nie definiuje as is bez potrzeby dziedziczenia IService interfejs? Czy to podwaja kod? - dlaczego
SomeBaseClass
musi również wszczepićICarService
? Czy baza serwisowa nie powinna być wystarczająca?
1 answers
Ad 1: dodatkowa abstrakcyjna klasa bazowa pozwala na ewolucję interfejsu bez przerywania implementacji. Zakładając, że nie ma abstrakcyjnej klasy bazowej, i rozszerzyłbyś interfejs, powiedzmy, dodając nową metodę. Wtedy twoja implementacja została przerwana, ponieważ twoja klasa nie implementuje już interfejsu.
Używając dodatkowej abstrakcyjnej klasy bazowej możesz to oddzielić: jeśli dodasz nową metodę do interfejsu, możesz dostarczyć wirtualną implementację w bazie klasa i wszystkie podklasy mogą pozostać takie same i mogą zostać dostosowane do nowego interfejsu w późniejszym czasie.
Co więcej, Ta kombinacja pozwala zdefiniować kontrakt (za pomocą interfejsu) i dostarczyć pewne domyślne mechanizmy (za pomocą abstrakcyjnej klasy bazowej). Każdy, kto jest w porządku z domyślnymi wartościami, może dziedziczyć z abstrakcyjnej klasy bazowej. Każdy, kto chce super-duper grzywny kontroli o każdy mały szczegół może zaimplementować interfejs ręcznie.
[[3]}Ad 2: z technicznego point of view nie ma potrzeby aby zaimplementować interfejs w końcowej klasie. Ale to, znowu, pozwala rozwijać rzeczy oddzielnie od siebie. ACarService
to na pewno a Service<Car>
, ale może nawet więcej. Może tylko CarService
potrzebuje dodatkowych rzeczy, które nie powinny wchodzić do wspólnego interfejsu ani do klasy service base.
Chyba dlatego ; -)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-30 15:24:34