tl, dr - kullanmaChild
üzerindeParent
yerel kapsamında tercih edilir. Yalnızca okunabilirliğe yardımcı olmakla kalmaz, aynı zamanda aşırı yüklenmiş yöntem çözünürlüğünün düzgün çalıştığından ve verimli derlemeye olanak sağladığından emin olmak için de gereklidir.
Yerel kapsamda
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
Kavramsal olarak, mümkün olan en fazla bilgiyi sağlamakla ilgilidir. Eğer düşürürsek Parent
, aslında sadece yararlı olabilecek tipteki bilgileri çıkartıyoruz.
Tam tip bilgiyi saklamanın dört ana avantajı vardır:
- Derleyiciye daha fazla bilgi sağlar.
- Okuyucuya daha fazla bilgi sağlar.
- Daha temiz, daha standart kod.
- Program mantığını daha değişken kılar.
Avantaj 1: Derleyiciye daha fazla bilgi
Belirgin tip aşırı yüklenmiş yöntem çözünürlüğünde ve optimizasyonda kullanılır.
Örnek: Aşırı yüklenmiş yöntem çözünürlüğü
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
Yukarıdaki örnekte, her iki foo()
çağrı da işe yarar , ancak bir durumda daha iyi aşırı yüklenmiş yöntem çözünürlüğünü elde ederiz.
Örnek: Derleyici optimizasyonu
main()
{
Parent parent = new Child();
var x = parent.Foo();
Child child = new Child();
var y = child .Foo();
}
class Parent
{
virtual int Foo() { return 1; }
}
class Child : Parent
{
sealed override int Foo() { return 2; }
}
Yukarıdaki örnekte, her iki .Foo()
çağrı da sonuçta override
geri dönen aynı yöntemi çağırır 2
. Sadece, ilk durumda, doğru yöntemi bulmak için sanal bir yöntem arama var; Bu sanal yöntem arama, bu yöntemden bu yana ikinci durumda gerekli değildir sealed
.
Benzer bir örnek teşkil @Ben Kredi onun cevabını .
Avantaj 2: Okuyucuya daha fazla bilgi
Tam tipini bilmek, yani Child
, kodu okuyanlara programın ne yaptığını görmeyi kolaylaştıran daha fazla bilgi sağlar.
Elbette, belki de her ikisi için de geçerli olan kod için bir önemi yoktur parent.Foo();
ve child.Foo();
mantıklıdır, ancak biri kodu ilk defa gören biri için daha fazla bilgi basit olur.
Ayrıca, geliştirme ortamına bağlı olarak, IDE hakkında daha yararlı ipuçları ve meta verilerini sağlayan mümkün olabilir Child
daha Parent
.
Avantaj 3: Daha temiz, daha standart kod
Son zamanlarda gördüğüm C # kod örneklerinin çoğu var
, bunun için temelde steno olan Child
.
Parent obj = new Child(); // Sub-optimal
Child obj = new Child(); // Optimal, but anti-pattern syntax
var obj = new Child(); // Optimal, clean, patterned syntax "everyone" uses now
var
Beyanname dışı bir ifadeyi görmek sadece göze çarpıyor; durumsal bir neden varsa, harika, ama aksi takdirde anti-pattern görünüyor.
// Clean:
var foo1 = new Person();
var foo2 = new Job();
var foo3 = new Residence();
// Staggered:
Person foo1 = new Person();
Job foo2 = new Job();
Residence foo3 = new Residence();
Avantaj 4: Prototipleme için daha değişken program mantığı
İlk üç avantaj, büyük avantajlardı; bu çok daha durumsal.
Yine de, diğerleri gibi kod kullananlar için Excel kullanıyor, kodumuzu sürekli değiştiriyoruz. Belki özgü bir yöntemi çağırmak gerekmez Child
içinde bu kod sürümü, ama biz repurpose veya daha sonra kodu biçim verebilirsiniz.
Güçlü bir tip sistemin avantajı, bize program mantığımız hakkında bazı meta veriler sağlayarak olanakları daha kolay ortaya çıkarmasıdır. Bu prototip yapımında inanılmaz derecede faydalıdır, bu yüzden mümkün olduğunda saklamak en iyisidir.
özet
Kullanılması Parent
Aşırı yüklü yöntem çözünürlüğü kadar pisliklerimizi, bazı derleyici optimizasyonlar inhibe okuyucudan bilgileri kaldırır ve kod çirkin yapar.
Kullanımı var
gerçekten gitmek yoludur. Hızlı, temiz, desenli ve derleyicinin ve IDE'nin işlerini doğru yapmasına yardımcı olur.
Önemli : Bu cevap hakkındadırParent
vs.Child
bir yöntemin yerel kapsamında. SorunuParent
vsChild
dönüş türleri, argümanlar ve sınıf alanları için çok farklıdır.