2012-12-30 18 views
27

Aşağıdaki kod düzeni okuma forumlarını ve diğer blog yayınlarını gördüm ve birkaç soru sormak için uyarlandım.C# Özet Sınıf bir Arayüz uygulayarak

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); 
} 

Anlamadığım şey, arabirimi uygulayan özet sınıfının yararıdır. Bana göre sadece biraz tekrarlayıcı geliyor ve arayüzü uygulayan soyut bir sınıfa sahip olma avantajını anlayamıyorum.

  1. Özet sınıf teması ServiceBase<T> yalnızca IService arabirimini devralmaya gerek duymadan tanımlamıyor mu? Bu, kodu ikiye katlıyor mu?
  2. Neden SomeBaseClass, ICarService'u da reddetmelidir? ServiceBase yeterli olmamalı mı?

cevap

32

Reklam 1: Ek soyut taban sınıfı, uygulamayı bozmadan arabirimi geliştirmenize izin verir. Soyut bir temel sınıf bulunmadığını ve ara yüzünüzü genişleteceğinizi varsayalım, yeni bir yöntem ekleyerek diyelim. Daha sonra uygulamanız bozuldu, çünkü sınıfınız artık arayüzü desteklemiyor.

Ek bir temel taban sınıfı kullanarak bunu ayırabilirsiniz: Arabirime yeni bir yöntem eklerseniz, temel sınıfta sanal bir uygulama sağlayabilir ve tüm alt sınıflarınız aynı kalabilir ve kabul edilebilir. Yeni arayüzü zaman içinde daha sonraki bir noktaya eşleştirmek için. Ayrıca, bu kombinasyon bir sözleşmeyi (arabirimi kullanarak) tanımlamanıza ve bazı varsayılan mekanizmalar sağlamanıza (soyut temel sınıfı kullanarak) olanak sağlar. Varsayılanları ile iyi olan herkes soyut temel sınıftan miras alabilir. Herhangi bir küçük detay hakkında süper-ince kontrol isteyen herkes arayüzü manuel olarak uygulayabilir.

Reklam 2: Teknik açıdan bakıldığında, arabirimi son sınıfta uygulamak için NEED yoktur. Fakat bu yine, şeyleri birbirinden ayrı olarak geliştirmenize izin verir. Bir CarService kesinlikle bir Service<Car>, ama belki daha da fazlasıdır. Belki sadece CarService, ortak arabirime veya hizmet taban sınıfına girmemesi gereken bazı ek şeylere ihtiyaç duyar.

Bunu fark ettiniz ;-)

+1

bir şey SomeBaseClass oldu neden hep 'düşünülmüştü saklanmasında eğer yeni bir anahtar kelime üyesi Y. Kullanımı miras gizler X' diyor yöntemleri bir uyarı olsun sanırım. Soyut sınıfın 'Ekle' olması nedeniyle, servis arayüzünde 'Ekle' vardır, ne yapacağını bilmez. – fes

+1

Son cümlede kimlerden "o" ile kastediyorsunuz? Derleyici uyarısı kesinlikle burada ... –