C#

2009-03-08 6 views
16

arayüzünün özelliklerine 'set' ekleyin. Arabirimdeki özelliklere erişim sağlayan setler sağlayarak bir arabirimi 'genişletmeyi' istiyorum. arayüz şöyle görünür: C#

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

Ben kalıtım gerekir:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

Böyle bir şey istiyorum. IUser gövdesini IMutableUser'a kopyalayamıyorum ve set erişimcileri ekleyemiyorum.

Bu mümkün C#? Eğer öyleyse, nasıl başarılabilir?

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

başka olasılık bu sahip olmaktır:

cevap

12

Çalıştığın olmamalıdır ne attılar bir neden göremiyorum? Sadece hızlı bir test yaptı ve tamamlandı, ancak saklanma hakkında bir uyarı veriyor. Bu böyle, yeni bir anahtar kelime ekleyerek düzeltilebilir:

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

alternatif açık kümesi yöntemleri eklemek olacaktır; örneğin:

Tabii
public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

, ben ayarlayıcıları kullanmayı tercih ediyorum, ama mümkün değilse, sana gerekeni yap sanırım.

+0

Yeni eklenen harika çalıştı! Teşekkürler! Cevabınızı bir örnekle (başkaları için) güncelleyebilir misiniz? – strager

+0

Pratik açıdan: Arayüzler zaman içinde çok kötü gelişir. Arabirimin tüm uygulayıcıları bu sözleşmedeki her değişiklikten kurtulacaklar .... –

+0

@PatrickPeters - Yorumun SetUserName yöntemine yönlendirildiğini varsayalım? İlk seçenekle ilgili sorunları görmüyorum. Uygulamanın uygun olduğu yerlerde açık uygulamayı takip etmesi halinde olası molaların bir kısmı ortadan kaldırılır. – Maslow

8

Sen soyut bir sınıf kullanabilirsiniz

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

IUser'ı devralmak için MutableUser'e ihtiyacım var. İlk yönteme bakacağım. – strager

+0

Soyut bir sınıf çalışması kullanır. Ancak, burada en şık çözüm gibi görünmüyor. Bu soruyu, olası "daha iyi" cevaplar için biraz açık bırakacağım. – strager

7

Arabirimleri açık bir şekilde uygulayarak bir arabirimdeki özellikleri "geçersiz kılabilirsiniz". Chris'in cevabı, özetlediğiniz senaryo için ihtiyaç duyacağınız her şeydir, ancak biraz daha karmaşık bir senaryoyu düşünün, sınıfınızda bir alıcı/ayarlayıcıya ihtiyacınız var, ancak arabirim yalnızca alıcıyı tanımlar. Aşağıdakileri yaparak bu sorunun üstesinden gelebilirsiniz: açıkça IUser.MyProperty uygulayarak

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

, kontrat karşılamaktadır. Ancak, genel MyProperty'u sağlayarak, nesnenizin API'si hiçbir zaman açık arabirim sürümünü göstermez ve her zaman MyProperty'yi get/set ile birlikte kullanır.