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.

  1. dlaczego klasa abstrakcyjna ServiceBase<T> po prostu nie definiuje as is bez potrzeby dziedziczenia IService interfejs? Czy to podwaja kod?
  2. dlaczego SomeBaseClass musi również wszczepić ICarService? Czy baza serwisowa nie powinna być wystarczająca?
Author: fes, 2012-12-30

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. A CarService 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 ; -)

 38
Author: Golo Roden,
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