2011-01-31 32 views
6

Hem this() hem de base() yapıcısını belirtmek için hiçbir dil sözdizimi görünmüyor. Bu (0) çağrı:this() ve base() constructor C#

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

derleyici bana uncommenting zaman '{' bekleniyordu belirten bir hata verir: Aşağıdaki kodu Verilen. Bu rahatsız edici çünkü bu işlevin açık bir şekilde engellenmesi için kodumun özel bir yönteme dahil edilmesine neden oldu.

Bunu yanlış mı yapıyorum? Ayırıcı, yarı-virgül, virgül denemedim ... Görünüşe bakılırsa bu, dev ekibinden bir gözetim. Bunun neden atlanmasıyla ilgileniyorum, eğer bu yanlış yoldan gidersem veya herhangi birinin alternatifler için iyi önerileri varsa.

+1

Mümkün [Muhakkak Yüklenen Kurucu ve Temel Kurucu] 'nın olası kopyası (http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded

+2

Hepinize teşekkürler cevabın Esas olarak, problem, bu() başka bir temel kurucusu da arayabilmesidir. – Sprague

cevap

8

Sen zincirinin sonunda temel kurucu çağırarak gerçekleştirebilirsiniz:

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
+0

Teşekkürler, bu cevaptır. Daha sonra diğerleri de benzer şeyler söylediler (daha açık bir şekilde) ama bu kesinlikle bu. – Sprague

3

Hayır, yalnızca bir kurucuya (aynı sınıftaki başka bir kurucuya veya bir temel kurucuya) zincirleme yapabilirsiniz.

Yapmaya çalıştığınız şey tam olarak belli değil. Tipik olarak, türetilmiş bir sınıfta bir "birincil" yapıcı oluşturmaya değer buluyorum: türetilmiş sınıftaki diğer tüm kurucular, "temel" olarak adlandırılan ve temel taban yapısını çağırmak için "bu" sözcüğünü çağırmak için kullanılır.

o modeli her senaryo uymuyor iken - özellikle farklı türetilmiş yapıcıları farklı taban kurucular çağırmak istediğinizde - bu genellikle iyi model.

1

Tasarımınızda Bar ve Foo sınıfları arasında pek çok genel şey göremiyorum. Her şeyi yeniden oluştururken, Foo neden Bar'dan türetilir? Her iki sınıf da public getter ve private setter ile bir tamsayı özelliğine sahiptir ve her iki sınıf da varsayılan kuruculara ve tamsayı özelliğini başlatmaya izin veren bir kurucuya sahiptir. Peki neden bu iki sınıf zaten var?

0

Bar'da ikinci ctor yanlıştır. Deneyin:

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

ilk ctor içinde comment değeri = 1

ile = 0

  • çağrı baz ctor Foo schmalue ile

    • initialize Bar gibi bir şey demek gibi görünüyor

      Doğru mu?

      , bunu ikinci ctor yerini ve basit işlemek hem

      public Bar(int schmalue) 
          :this(1, schmalue) //would call Bar(1, schmalue) 
      { 
      } 
      
      private Bar(int value, int schmalue) 
      :base(value) 
      { 
          //Gobs of initialization code 
          ... 
          Schmalue = schmalue; 
      } 
      
  • 3

    Bir yapıcı inşaatçı olarak hem this ve base diyebiliriz ne olacağını düşünün değerleri başka (özel) ctor ekleyin. Önce temel kurucunun çağrılacağını varsayalım. Daha sonra, this yapıcısı çağrılacak - kendisinin temel kurucuyu arayacağı. Böylece, temel sınıf iki kez örneklendirilebilir. Bu, kurucuların semantiğini kırar - yani, bir nesne bir kez inşa edilir.base ve this hem çağırarak Gibi

    , yasaktır. Yetkilendirilmiş this yapıcınızın, gerekirse, belirli parametrelerle tabanı çağırmasına izin verin.

    İlgili konular