:base()
ve :this()
yapıcıların yapıcı parantezleri (hatta kodun diğer yerlerinde bile) izleyen çağrıları yapmam gereken koşullar. Bunlar ne zaman iyi uygulamaları arar ve ne zaman zorunludur?base() ve this() yapıcıların en iyi uygulamaları
cevap
: base(...)
otomatik olarak varsayılan temel kurucu arayacak.
Varsayılan kurucu yoksa, temel kurucuyu açıkça çağırmak zorunludur.
Varsayılan bir kurucu olsa bile, varsayılan kurucudan farklı bir kurucu çağırmak isteyebilirsiniz. Bu durumda hala temel kurucudan farklı bir kurucu çağırmak için base(foo, bar)
kullanmak isteyebilirsiniz.
Temel sınıf varsayılan yapıcısını çağırmak istediğinizde, base()
'u atlamak için kötü bir uygulama olduğunu düşünmüyorum, ancak açıklamayı seviyorsanız dahil etme konusunda hiçbir zarar görmüyorum. Bu bir tat meselesi.
: this(...)
Bu söz dizimi aynı sınıfın içinde başka farklı bir imzayla bir kurucusunu çağırmak için izin verir. Bunu yapmak asla zorunlu değildir, ancak bazen yararlı olabilir.
Kullanışlı olabileceği bir örnek, kuruculardaki ortak kodun yeniden kullanılmasıdır. Örneğin C# 3.5 veya daha önce, bir kurucunun üzerinde isteğe bağlı parametreleri simüle etmek isteyebilirsiniz: C# 4.0 isteğe bağlı parametreleri ile
Foo(int x, int y)
{
this.x = x;
this.y = y;
}
Foo(int x) : this(x, 10) {} // y defaults to 10
artık kullanılabilir Bu yaklaşımın gerekliliğini azaltır.
Kuruculardaki kodu yeniden kullanmanın alternatif bir yolu, onu kullanmak isteyen her kurucudan çağrılan statik bir işleve dahil etmektir.
"C# içinde kurucu zincirleme" konusuna bakın. Bu kurucular kod tekrarını ortadan kaldırmak için yardımcı olur
MyClass():base() //default constructor calling superclass constructor
{
}
MyClass(int arg):this() //non-basic constructor calling base constructor
{
//extra initialization
}
- Temel ve belirli bölümlerine bölün: Temel olarak, bu gibi görünüyor. Bir temel kurucu çağrıyı atlarsanız
Teşekkürler. "Yapıcı zincirleme", hatırlamadığım dönemdi. – JNappi
Temel sınıfı kurucusunun, kurucunuzun ilk talimatı olarak otomatik olarak çağrılmasını istediğinizde, base() yöntemini kullanırsınız. : Bu() benzer, ama aynı sınıfta başka bir kurucu çağırıyor.
Temel :() ve this(): parametreler sabit değerleri veya yapıcınızın parametrelerini temel alan ifade olarak iletebilirsiniz.
Temel sınıf varsayılan bir kurucu olmadığında (herhangi bir parametre almayan) temel yapıcıyı çağırmak zorunludur. Hangi durumda olduğunu bilmiyorum: Bu() zorunludur.
public class ABaseClass
{
public ABaseClass(string s) {}
}
public class Foo : AChildClass
{
public AChildClass(string s) : base(s) {} //base mandatory
public AChildClass() : base("default value") {} //base mandatory
public AChildClass(string s,int i) : base(s+i) {} //base mandatory
}
public class AnotherBaseClass
{
public ABaseClass(string s) {}
public ABaseClass():this("default value") {} //call constructor above
}
public class Foo : AnotherChildClass
{
public AnotherChildClass(string s) : base(s) {} //base optional
}
Öncelikle zorunlu olduklarında.
bir sınıfDerived
bir sınıf
Base
türetilmiştir
ve Base
Derived
parametreleri ile açıkça base()
çağırmalıdır, varsayılan (parametresiz) yapıcısı yoktur.
public class Base {
public Base(int i) { }
}
public class Derived : Base {
// public Derived() { } wouldn't work - what should be given for i?
public Derived() : base(7) { }
public Derived(int i) : base(i) { }
}
zaman iyi bir uygulamadır? Ne zaman farklı bir kurucu aramak istersen.
Önceden verdiğim örnekte, Türetilmiş yapıdaki yapıcılara içerik eklediğinizi varsayalım.
public class Derived : Base {
// public Derived() { } wouldn't work - what should be given for i?
public Derived() : base(7) {
Console.WriteLine("The value is " + 7);
}
public Derived(int i) : base(i) {
Console.WriteLine("The value is " + i);
}
}
Burada çoğaltmayı görüyor musunuz? Bu() yapıcısını çağırmak daha basittir.
public class Derived : Base {
// public Derived() { } wouldn't work - what should be given for i?
public Derived() : this(7) { }
public Derived(int i) : base(i) {
Console.WriteLine("The value is " + i);
}
}
Yani son örnekte çağrı sırası şöyle olurdu: baz (7) 've sonra Türetilmiş (7), sonra da Türetilmiş(). Başka bir deyişle, bu (7) parçanın kendisi bir 'base() '(böyle bir temel yöntem olduğu varsayılarak) tetiklemeyecektir. Doğru mu? – RayLuo
Doğru; Kurucular her zaman zincirlenmişlerdir ve her sınıf kendi sınıfının yapıcılarını çağırır. Bunu kullanarak, bu sınıfın diğer kurucusunu (kendi deyimiyle ya da hiç bir argümanla ya da açıkça) 'taban' kullanacaksınız; 'base' kullanarak hangi temel sınıf kurucusunun arandığını seçersiniz. – configurator
Kullanım base
orada miras olduğunu ve bir üst sınıf zaten ulaşmaya çalıştığınız işlevsellik sağlar zaman.
Geçerli öğeye (veya kendinize) başvurmak istediğinizde, başka bir kurucuda önceden tanımlanmış işlevselliği çoğaltmak istemediğinizde, kurucunun üstbilgisinde/imzasında kullanın (this
). Temelde
, tabanını kullanarak ve bu şantiye başlığında daha sürdürülebilir ve
İşte kesinlikle anlamsız örnek daha az ayrıntılı hale kodunuzu DRY tutmaktır, ama gösteren fikrini göstermektedir düşünüyorum ikisi kullanılabilir.
class Person
{
public Person(string name)
{
Debug.WriteLine("My name is " + name);
}
}
class Employee : Person
{
public Employee(string name, string job)
: base(name)
{
Debug.WriteLine("I " + job + " for money.");
}
public Employee() : this("Jeff", "write code")
{
Debug.WriteLine("I like cake.");
}
}
Kullanımı:
belirsizliğevar foo = new Person("ANaimi");
// output:
// My name is ANaimi
var bar = new Employee("ANaimi", "cook food");
// output:
// My name is ANaimi
// I cook food for money.
var baz = new Employee();
// output:
// My name is Jeff
// I write code for money.
// I like cake.
- 1. this() ve base() constructor C#
- 2. Regex en iyi uygulamaları
- 3. Fragman en iyi uygulamaları
- 4. Herkes için en iyi uygulamaları
- 5. TFS ödeme en iyi uygulamaları
- 6. MATLAB programlama en iyi uygulamaları
- 7. . Net çözüm subversion en iyi uygulamaları?
- 8. Asenkron Web Gereksinimi en iyi uygulamaları
- 9. Chrome eklentisi giriş en iyi uygulamaları
- 10. Django, en iyi uygulamaları zincirleme/yönlendirmeyi görüntüleme
- 11. Kohana çerçevesi - Ajax uygulaması en iyi uygulamaları
- 12. Bir galerinin en iyi JavaScript uygulamaları nelerdir?
- 13. MVVM-light + RIA Hizmetler en iyi uygulamaları
- 14. objektif-c en iyi uygulamaları günlüğe kaydetme
- 15. SQL Server şeması en iyi uygulamaları
- 16. __repr __() işlevleri için en iyi çıktı türü ve kodlama uygulamaları?
- 17. Facebook uygulamaları için en iyi IDE (FMBL ve FBJS desteği)
- 18. .NET için en iyi DLL-Base Veritabanı nedir?
- 19. tarihinde Uygulamaları ve OAuth iyi uygulamalar
- 20. jQuery içinde $ (this) önbelleğe almak en iyi uygulamadır?
- 21. java.lang.IncompatibleClassChangeError: yapıcıların sayısı
- 22. Çevrimdışı Web Uygulamaları için Bugün En İyi Yaklaşım
- 23. Web uygulamaları için en iyi görünümlü yönetim panelleri
- 24. R'de programlama için hangi en iyi uygulamaları kullanıyorsunuz?
- 25. Bölme sayısının en iyi uygulamaları için hazır mısınız?
- 26. Python için en iyi GUI?
- 27. Java web uygulamaları için en iyi 3D grafik kütüphanesi nedir?
- 28. İyi Entity Framework örnek uygulamaları?
- 29. en iyi (veya en azından iyi) kılavuz
- 30. Üst nesne alanına, özelliğine veya yöntemine başvururken 'base' ve 'this' arasında bir fark var mı?
üzgün ... Ben bu aramalar ne yaptığını biliyoruz. Bu çağrıları yapmam gerektiğinde ya da yapmam gerektiğinde senaryo hakkında net bir görüş bildirmedim. Onları yapmazsam, ya hemen ya mahkum olurum ya da gizli bir hata ya da kötü kod kalitesi olacak yerler. Son zamanlarda böyle bir baş ağrım vardı, bu yüzden bu senaryoları açıklığa kavuşturmak istedim. - – explorer