2010-03-09 11 views
33

Aşağıdaki kodum bir daha derlenmiyor. Neyi yanlış yapıyorum? Temel olarak, temel sınıfta geçersiz kılınan bir kamu sabitine sahip olmaya çalışıyorum.C# 'de soyut ve geçersiz kılan sabitler nasıl bulunur?

public abstract class MyBaseClass 
{ 
    public abstract const string bank = "???"; 
} 

public class SomeBankClass : MyBaseClass 
{ 
    public override const string bank = "Some Bank"; 
} 

Her zamanki gibi yardımcı olduğunuz için teşekkürler!

+0

Ya da bir kutu solucan açtım çünkü const'lar statik, bu yüzden polimorfizm onlara gerçekten uygulanmıyor mu? – Chris

+0

Belki de yukarıdaki kodla gerçekleştirmeye çalıştığınız şeyi açıklamalısınız? Banka adı neden örnek özellik olamaz? Sınıfta olduğu ve sınıfın aynı isim olduğu için sadece doğal gözüküyor mu? –

+0

bu önceki gönderiye göz atın http://stackoverflow.com/questions/770437/overriding-constants-in-derived-classes-in-c/770443#770443&hl=tr –

cevap

41

Eğer sabitiniz nesneyi açıklıyorsa, o zaman bir özellik olmalıdır. Bir sabit, ismi ile değişmemeli ve polimorfizmden etkilenmeyecek şekilde tasarlanmalıdır. Aynısı statik değişken için de geçerlidir.

(veya varsayılan bir değer istiyorsanız veya sanal) Eğer taban sınıfta soyut özelliğini oluşturabilirsiniz: durumunda

public override string Bank { get { return "Some bank"; } } 
+0

" Yeni "anahtar kelimesini uyarı olmaması için geçersiz kılma koduna eklemek zorunda kaldım. – Sunkas

+2

" Yeni "anahtar kelimeye ihtiyaç var. "sanal" veya "soyut" olarak bildirilmeyen bir üst işlevi geçersiz kıldığınızda, –

+0

Adam! Böyle iyi bir cevap. –

13

Yapmaya çalıştığınız şey yapılamaz. static ve const geçersiz kılınamaz. Yalnızca örnek özellikleri ve yöntemleri geçersiz kılınabilir.

Sen gibi soyut olarak bir mülkiyet ve piyasada bunu için o bank alanını açabilirsiniz şunlardır:

public abstract string Bank { get; } 

Sonra kalıtsal sınıfta geçersiz olacaktır Eğer

public override string Bank { get { return "Charter One"; } } 
yapıyor gibi

Umarım bu size yardımcı olur. Flip tarafta da static yana miras sınıftan

public const string Bank = "Charter One"; 

daha sonra

public const string Bank = "???"; 

ve yapabileceği ve const polimorfizm onlar overriden gerekmez dışında çalışırlar.

+0

Bir kurmayı geçersiz kılabilirsiniz. Neden yapamazsınız? Bir tasarım kararı gibi geliyor ve C# 'daki tasarım kararlarının çoğu IMO'nun arkasındaki geçerli ve ilginç nedenlere sahip. Bu yüzden merak ediyorum. – Chris

+2

derleyici, derleme zamanında –

+0

"statik" ve "const" kelimelerinin yerine, Global tanımları olarak daha iyi düşünüldüğü anlamına gelir ve bu da polimorfizme uymadıkları anlamına gelir. Ve sınıfın başlatılmasıyla çağrılabilir. Gönderiyi güncellediğime göre.İstediğini yapabilirsin, ama bunu başarmak için gerçekten polimorfizmi kullanamazsın. –

3

Kullanmaya devam etmek istiyorum:

public abstract string Bank { get; } 

Sonra ile geçersiz kılmak "const", yukarıda hafif bir modificaiton:

public abstract string Bank { get; } 

Sonra ile geçersiz kılmak:

private const string bank = "Some Bank"; 
public override string Bank { get { return bank;} } 

Ve özellik, "const" öğenizi türetilmiş türden döndürecektir.

+0

Ne yazık ki, 'SomeBankClass.Bank' erişmeye çalışırsam, const olarak geri dönmez. Nesne başvurusu, statik olmayan alan, yöntem veya özellik olan 'SomeBankClass.Bank' özelliği için gereklidir. 'Banka', 'SomeBankClass' içinde bir public const dizgisi olduğunda bu erişim gayet iyi. – Gobe

İlgili konular