C # neden arabirimlerdeki özelliklere izin veriyor?


47

C #, aşağıdaki kod geçerlidir

interface I{
    int property{get;set;}
}

Bu bana hiç mantıklı gelmiyor. Bu, arayüzlerin en önemli prensiplerinden birini kırıyor gibi görünmektedir: devlet eksikliği (başka bir deyişle alan yok). Mülkiyet gizli bir özel alan oluşturmuyor mu? Bu arayüzler için gerçekten kötü olmaz mıydı?


12
Devlet eksikliği, arayüz uygulamasının ilkelerinden biri mi? Bana göre arayüz, bir sözleşmeyi tanımlamanın bir yoludur, yani eğer bir sınıf böyle bir arayüzü uygularsa, sözleşmede tanımlanan tüm yöntem ve özelliklere sahiptir.
Florian Margaine

4
Bir özellik sadece bir get ve set metodudur. Arayüzler, uygulamanız gereken yöntemlerin bir listesi olduğundan, arayüzlerin bunlara sahip olması doğaldır.
Doval,

1
@FlorianMargaine Kesinlikle bir sözleşme kavramı arayüzlerin en önemli prensibidir, ancak devletin eksikliği de önemlidir. Bu soyut bir sınıftan ayrı tutmaya yardımcı olur. Java 8'deki IE, bunun sonucunda arayüzler ve soyut sınıflar arasındaki tek büyük fark olur.
Monica'yı

2
Çünkü bu bir alan değil. Bkz. Neden C # arayüzleri alanlar içeremez?

2
@Doval: Bir arabirimin bu yöntemleri bildirmesi doğaldır , ancak bunları uygulayamaması doğaldır .
Giorgio

Yanıtlar:


65

Bence kafa karıştırıcı kısım, eğer int Property { get; set; }bir sınıfın içine yazarsanız , o zaman gizli destek alanı olan bir otomatik özelliktir.

Ancak, bir arayüzü tam olarak aynı şeyi yazarsanız, o zaman otomatik özellik değildir , yalnızca özelliğin arabirimin bir parçası olduğunu ve arabirimi uygulayan herhangi bir türün bu özelliği içermesi gerektiğini (otomatik özellik veya değil) bildirir. ), ancak destek alanı oluşturmuyor.

Farkı görmenin bir yolu yazmaktır int Property { get; }: bu bir arayüzde geçerlidir ve yalnızca alıcıya sahip olan ancak ayarlayıcı olmayan bir özellik ilan eder. Ancak bir sınıfta derlenmeyecektir (C # 6.0 kullanmıyorsanız), çünkü auto-property'nin bir ayarlayıcısı olması gerekir.


18

Eğer gösterdiğin olarak mülkiyet tanımlama yöntemleri tanımlayan aynıdır int GetProperty()ve void SetProperty(int i). Özellikler C # 'ta güçlü ellerdir.

Bir özellik örtülü olarak C # ile özel bir alan oluşturmaz. Bu, auto-propertyörneğin public string MyString { get; set;}- varsayılan getyöntemdir - ancak, yöntemde özel mantığı tanımlayan bir özellik, örtük bir özel alan oluşturmaz.

Son olarak, arayüzler genel API ile ilgilendiği için, bir arayüz özelliğinin uygulanmasının özel bir alana dayanması ne anlama gelirdi - örtük veya başka türlü? Bu ne olursa olsun arayüzün tüketicilerinden gizlenir.


Ahh ... Bunun sadece otomatik özellikler için olduğunu fark etmedim ve bunu geçersiz kılmanız gerektiğinden, bu mantıklı geliyor. Ancak eğer arayüz dahili bir özel değişken oluşturmaksa, uygulayıcılar buna erişemez - açık bir problem.
Monica'yı

9
Bir C # arabiriminde bir özellik tanımlarsanız, o özelliğin uygulaması, uygulayıcı sınıfa bırakılır - onu bir otomatik özellik yapabilir veya uygun gördükleri şekilde özel bir mantık tanımlayabilirler. Hayır alanı eklenir arayüzüne .
NWard

10

Özellikleri şunlardır yöntemleri! Arabirimi uygulayan sınıfa (elle veya bir otomatik özellik aracılığıyla) bir destek alanı eklenir .


Bazen destek alanı olmaz. Her ne kadar bir get ve set tanımlamak nadirdir ve bunun için bir destek alanı yoktur.
Stephen

+1 Özellikler yöntemdir! Evet! Propertymethods yazmayı seviyorum, ancak kodları inceleyen iş arkadaşları bunu böyle görmüyor ve programlarımızdaki güzel ifade edici kapsülleme fırsatlarını gerçekten çok özlüyoruz.
radarbob

Bu "özellik yöntemleri", herhangi bir DB araması veya benzeri bir şey olmamasına rağmen hızlı olmalıdır. Mülkiyet erişiminin hızlı olduğuna dair zımni bir sözleşme var, Get * yöntemleri yavaş olabilir.
Trey Mack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.