Çoğu zaman açık arabirim uygulaması kullanıyorum. İşte ana nedenleri.
Yeniden düzenleme daha güvenlidir
Bir arayüzü değiştirirken, derleyicinin kontrol edebilmesi daha iyidir. Örtülü uygulamalar için bu daha zordur.
İki yaygın durum akla geliyor:
Bir arabirime işlev eklemek, bu arabirimi uygulayan var olan bir sınıfın zaten yenisiyle aynı imzayla bir yöntemi olduğu görülür . Bu beklenmedik davranışlara yol açabilir ve beni birkaç kez sert ısırdı. Hata ayıklama sırasında "görmek" zordur, çünkü bu işlev büyük olasılıkla dosyadaki diğer arayüz yöntemleriyle (aşağıda belirtilen kendi kendini belgeleme sorunu) bulunmaz.
Arabirimden bir işlevi kaldırma . Örtülü olarak uygulanan yöntemler aniden ölü kod olacaktır, ancak açıkça uygulanan yöntemler derleme hatasıyla yakalanacaktır. Ölü kod etrafta tutmak iyi olsa bile, onu gözden geçirmek ve tanıtmak zorunda kalmak istiyorum.
C # 'ın bizi bir yöntemi örtük bir uygulama olarak işaretlemeye zorlayan bir anahtar kelimeye sahip olmaması talihsiz bir durumdur, böylece derleyici ekstra kontroller yapabilir. Sanal yöntemlerde, 'geçersiz kılma' ve 'yeni' kullanılması gerektiği için yukarıdaki sorunlardan hiçbiri yoktur.
Not: sabit veya nadiren değişen arabirimler için (genellikle satıcı API'lerinden), bu bir sorun değildir. Kendi arayüzlerim için, ne zaman / nasıl değişeceklerini tahmin edemiyorum.
Kendi kendini belgeliyor
Bir sınıfta 'public bool Execute ()' ifadesini görürsem, bunun bir arayüzün parçası olduğunu anlamak ekstra iş gerektirecektir. Birinin muhtemelen bunu söyleyerek yorum yapması ya da bir bölge ya da "ITask uygulaması" diyen bir grup yorumlaması yapması gerekir. Tabii ki, bu sadece grup başlığı ekran dışında değilse işe yarar ..
Halbuki: 'bool ITask.Execute ()' açık ve nettir.
Arayüz uygulamasının net olarak ayrılması
Arayüzleri, kamusal yöntemlerden daha 'kamusal' olarak düşünüyorum, çünkü bunlar beton tipinin yüzey alanının biraz bir kısmını açığa çıkarmak için üretildi. Türü bir kabiliyete, bir davranışa, bir dizi özelliğe vb. İndirirler. Ve uygulamada, bu ayrılığı sürdürmenin yararlı olduğunu düşünüyorum.
Bir sınıfın koduna baktığımda, açık arayüz uygulamalarına rastladığımda, beynim "kod sözleşmesi" moduna geçer. Genellikle bu uygulamalar sadece diğer yöntemlere yöneliktir, ancak bazen ekstra durum / parametre kontrolü, gelen parametrelerin dahili gereksinimlere daha iyi uyması için dönüşüm veya hatta sürüm oluşturma amaçları için çeviri (örneğin, ortak uygulamalara punting eden birden fazla nesil arayüz) yaparlar.
(Halkın da kod sözleşmesi olduğunu anlıyorum, ancak arayüzler, özellikle beton türlerinin doğrudan kullanımının genellikle sadece dahili kodun bir işareti olduğu arayüz odaklı bir kod tabanında çok daha güçlü.)
İlgili: Jon tarafından yukarıda 2. neden .
Ve bunun gibi
Ayrıca, diğer yanıtlarda daha önce bahsedilen avantajlar:
sorunlar
Hepsi eğlenceli ve mutluluk değil. Bazı etkilere bağlı olduğum bazı durumlar var:
- Değer türleri, çünkü bu boks ve daha düşük perf gerektirir. Bu katı bir kural değildir ve arayüze ve nasıl kullanılması amaçlandığına bağlıdır. Icomparable? Örtülü. IFormattable? Muhtemelen açık.
- Sıklıkla doğrudan çağrılan yöntemlere sahip (IDisposable.Dispose gibi) önemsiz sistem arabirimleri.
Ayrıca, aslında beton tipine sahip olduğunuzda ve açık bir arayüz yöntemi çağırmak istediğinizde döküm yapmak bir acı olabilir. Bununla iki yoldan biriyle ilgileniyorum:
- Halk ekleyin ve uygulama için arayüz yöntemlerini kendilerine iletin. Genellikle dahili olarak çalışırken daha basit arayüzlerde olur.
- (Tercih
public IMyInterface I { get { return this; } }
ettiğim yöntem) Bir ekleyin (satır içine alınmalıdır) ve arayın foo.I.InterfaceMethod()
. Bu yeteneğe ihtiyaç duyan birden fazla arabirim varsa, adı benden öteye genişletin (deneyimime göre bu ihtiyaca sahip olmak nadirdir).