2010-10-07 17 views
21

Teorik bir soruya rastladım.Bir Çocuk Sınıfında Bir Sanal Oto Mülkün Kısmen Geçersiz Kılınması

Aşağıdaki kod geçerlidir ve derler:

public class Parent 
{ 
    public virtual object TestProperty { get; set; } 
} 

public class Child : Parent 
{ 
    private string _testValue = "Hello World!"; 

    public override object TestProperty 
    { 
     get { return _testValue; } 
    } 
} 

public class Consumer 
{ 
    Parent p = new Child(); 

    public Consumer(){ p.TestProperty = 3; } 
} 

Sorum şu:

Neden C# bunu kısmen öngörülemeyen davranışları yol açtığında beni kısmen bir çocukta TestProperty oto özelliğini geçersiz kılmak için izin vermez ? Pratik bir uygulama var mı?

Ben ebeveynin ayarlayıcı (I IL oluşturuluyor kontrol ve ayarlayıcı hala üst sınıfta arka nesnesi kuruyor) değeri halka erişilebilir olmadığı halde kullanarak TestProperty değerini ayarlamak için izin var.

+1

İlginç bir soru! –

+2

Eminim ki, derlenecek ve işleyecek, ancak pratik bir uygulamaya ve potansiyel çirkin yan etkilere sahip olmayan çok tuhaf şeyler vardır. Çekiçler, onları nasıl kullandığınıza bağlı olarak evler inşa eder veya şut çeker :) –

+2

@Dave - Çok doğru. Sadece, bu durumda, baş parmaklarımın bir çekiçle kırılmasının, görmediğim bir amaca hizmet etmediğinden emin olmak istiyorum. –

cevap

12

Bu davranış, C# 'de otomatik uygulanmayan özelliklerle tutarlıdır. Bir sanal özellik için yalnızca bir get veya set yöntemini geçersiz kılmak her zaman mümkün olmuştur. Bu nedenle, otomatik olarak uygulanan bir özellik ile yapılmasını imkansız kılmak, gereksiz bir tutarsızlık yaratacaktır.

Örneğin, aşağıdaki

class A 
{ 
    public virtual int P1 
    { 
     get { return 42; } 
     set { } 
    } 
} 

class B : A 
{ 
    public override int P1 
    { 
     get { return 18; } 
    } 
} 
+0

Yeterince adil. Soru, o zaman, otomatik özelliklerle sınırlı değildir. Yine de pratik uygulamada biraz bulanık. Tüm mülkümü tek bir birim olarak ilan edersem ve o birim bir getiri ve setten oluşursa ... neden birini geçersiz kılmak ve diğerini potansiyel olarak kafa karıştırıcı davranışlarla bırakmak isterdim? –

+0

@Justin, Bir mülkün get ve set bölümleri temelde farklı yöntemlerdir, bu yüzden bağımsız olarak geçersiz kılınabilecekleri anlamına gelir. Neden belki de istemciye ekstra doğrulama eklemek veya getterde önbelleğe alma davranışı eklemek istiyorum ama diğer için varsayılan davranış tutmak istiyorum. Eminim bu – JaredPar

+1

@JaredPar - yapmak için bir dizi geçerli kullanım vakası olduğundan eminim - bunların temel olarak farklı yöntemler olduğunu anlıyorum, ama mantıken ikisi aklımda birleştiriliyor. Dil tasarımı açısından, neden, hem de geçersiz kılma gerektirmez ve eğer mevcut işlevselliği korumak istiyorsanız, sadece iade base.TestProperty() ;? (belki de bu yüzden dil tasarımı için kesilmediğimden dolayı) –

1

olsa, bir setter için mantıklı değil yasal mı? Yalnızca ayarlayıcıyı kısmen geçersiz kılarsanız, bu olaya yanıt verebilmeniz için, base.TestProperty = value numaralı çağrıyı yapmanın yanı sıra, kazanın bir kazan kaidesi ile uğraşmak zorunda kalmadan da yararlı olabilir.

İlgili konular