2009-05-20 32 views
9

Ortak özelliklerin çeşitli özelliklerin ayarlanmasında yer alan tüm mantıklardan sorumlu olduğu bir grup sınıf oluşturmaya çalışıyorum ve alt öğeler yalnızca özelliklerin erişimini değiştirip değiştirmeyeceğine bağlı olarak özelliklerin erişimini değiştirmeye çalışıyorum. onlar özel soyundan istenir.Bir özelliğin erişim düzenleyicisi nasıl artırılır

Bir derleyici hatası alıyorum aşağıda gösterildiği gibi bunu yapmak çalıştığınızda:

" 'korumalı' üyesi miras geçersiz kılarken erişim değiştiricileri değiştiremezsiniz" Ben çalıştığım şey başarmak için bir yol var mı yap? Teşekkür

public class Parent 
{ 
    private int _propertyOne; 
    private int _propertyTwo; 

    protected virtual int PropertyOne 
    { 
      get { return _propertyOne; } 
      set { _propertyOne = value; } 
    } 

    protected virtual int PropertyTwo 
    { 
      get { return _propertyTwo; } 
      set { _propertyTwo = value; } 
    } 
} 

public class ChildOne : Parent 
{ 
    public override int PropertyOne // Compiler Error CS0507 
    { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    // PropertyTwo is not available to users of ChildOne 
} 

public class ChildTwo : Parent 
{ 
    // PropertyOne is not available to users of ChildTwo 
    public override int PropertyTwo // Compiler Error CS0507 
    { 
     get { return base.PropertyTwo; } 
     set { base.PropertyTwo = value; } 
    } 
} 

cevap

11

Sen şöyle ebeveynin korumalı özelliği gizlemek için "yeni" yerine "geçersiz kılma" nin kullanarak bunu yapabilirsiniz:

public class ChildOne : Parent 
{ 
    public new int PropertyOne // No Compiler Error 
    { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    // PropertyTwo is not available to users of ChildOne 
} 

public class ChildTwo : Parent 
{ 
    // PropertyOne is not available to users of ChildTwo 
    public new int PropertyTwo 
    { 
     get { return base.PropertyTwo; } 
     set { base.PropertyTwo = value; } 
    } 
} 
+2

OOPS .. Saniye daha hızlı :) .. Her zaman yeni kullanarak geçersiz kılma aynı değil; Yeni ana üyeyi gizler ve bu şekilde artık Polimorfizm değildir. – Galilyou

+0

@ José, teşekkürler, ihtiyacım olanı yapar. – WileCau

2

NO. Hala Sizin en

public class ChildTwo: Praent { 
    public new int PropertyTwo { 
     // do whatever you want 
    } 
} 

ps ile kalıtsal özellik Gizleyebilirsiniz: Bu Sen erişimini değiştiremezsiniz

+0

@ 7alwagy, teşekkürler. Benim durumumda sanal/geçersiz kılma önemli değil, sadece temel özelliği geçersiz kılmak için ihtiyacım olduğunu düşündüm. 'Geçersiz' yerine 'yeni' kullanmak hile yapar. – WileCau

5

artık sanal/geçersiz kılma ilişkisi (yani hiçbir polimorfik aramalar) olmakla birlikte, yeniden beyan edebilir daha kolay erişmesi üye:

public new int PropertyOne 
{ 
    get { return base.PropertyOne; } 
    set { base.PropertyOne = value; } 
} 

sorun bu farklıPropertyOne ve beklendiği gibi sanal devralma/işe yaramayabilir olmasıdır. Yukarıdaki durumda (biz sadece base.* diyoruz ve yeni yöntem sanal değil) bu muhtemelen iyi. Eğer bu yukarıdaki gerçek polimorfizmin gerekiyorsa, o zaman bir ara sınıf tanıtan olmadan (AFAIK) yapamaz (çünkü yapamazsın new ve override aynı tip aynı üyesi):

public abstract class ChildOneAnnoying : Parent { 
    protected virtual int PropertyOneImpl { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    protected override int PropertyOne { 
     get { return PropertyOneImpl; } 
     set { PropertyOneImpl = value; } 
    } 
} 
public class ChildOne : ChildOneAnnoying { 
    public new int PropertyOne { 
     get { return PropertyOneImpl; } 
     set { PropertyOneImpl = value; } 
    } 
} 

Yukarıdaki önemli nokta, geçersiz kılmak için hala tek bir sanal üye olmasıdır: PropertyOneImpl.

+0

@Marc, Muhtemelen kafamı karıştırmıştım çünkü sanal/geçersizliğe ihtiyacım olduğunu düşündüm, ama bu durumda görünüşe göre yok. Ben polimorfizm ile yapmanız gerektiğinde cevabınıza bir bağlantı tutacağım :) Açıklama ve örnek kod için teşekkürler. – WileCau

İlgili konular