tl; dr - ควร ใช้Child
over overParent
ในขอบเขตโลคัล ไม่เพียงช่วยในการอ่านเท่านั้น แต่ยังจำเป็นเพื่อให้มั่นใจว่าการแก้ไขวิธีการทำงานมากเกินไปทำงานได้อย่างถูกต้องและช่วยในการรวบรวมที่มีประสิทธิภาพ
ในขอบเขตท้องถิ่น
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
โดยหลักการแล้วมันเกี่ยวกับการรักษาข้อมูลประเภทที่เป็นไปได้มากที่สุด หากเราปรับลดรุ่นParent
เป็นหลักเราเพียงแค่ดึงข้อมูลประเภทที่อาจเป็นประโยชน์ออกมา
การเก็บรักษาข้อมูลประเภทสมบูรณ์มีข้อดีสี่ประการ:
- ให้ข้อมูลเพิ่มเติมกับคอมไพเลอร์
- ให้ข้อมูลเพิ่มเติมแก่ผู้อ่าน
- รหัสมาตรฐานที่สะอาดกว่า
- ทำให้ตรรกะของโปรแกรมไม่แน่นอนมากขึ้น
ข้อได้เปรียบ 1: ข้อมูลเพิ่มเติมเกี่ยวกับคอมไพเลอร์
ประเภทที่ชัดเจนจะใช้ในการแก้ปัญหาวิธีการมากเกินไปและในการเพิ่มประสิทธิภาพ
ตัวอย่าง: การแก้ไขวิธีโอเวอร์โหลด
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
ในตัวอย่างข้างต้นการfoo()
โทรทั้งสองทำงานแต่ในกรณีหนึ่งเราจะได้รับการแก้ไขวิธีโอเวอร์โหลดที่ดีกว่า
ตัวอย่าง: การปรับให้เหมาะสมของคอมไพเลอร์
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; }
}
ในตัวอย่างข้างต้นทั้ง.Foo()
สายในที่สุดเรียกเดียวกันวิธีการที่ผลตอบแทนoverride
2
ในกรณีแรกมีการค้นหาวิธีการเสมือนเพื่อค้นหาวิธีการที่ถูกต้อง การค้นหาวิธีเสมือนนี้ไม่จำเป็นในกรณีที่สองนับตั้งแต่วิธีการsealed
นั้น
เครดิต @ Ben ที่ให้เป็นตัวอย่างที่คล้ายกันในคำตอบของเขา
ข้อได้เปรียบ 2: ข้อมูลเพิ่มเติมเพื่อผู้อ่าน
การรู้ประเภทที่แน่นอนคือChild
ให้ข้อมูลเพิ่มเติมแก่ผู้ที่กำลังอ่านโค้ดทำให้ง่ายต่อการดูว่าโปรแกรมกำลังทำอะไรอยู่
แน่นอนว่าอาจไม่สำคัญกับรหัสที่แท้จริงเนื่องจากทั้งคู่parent.Foo();
และchild.Foo();
สมเหตุสมผล แต่สำหรับบางคนที่เห็นรหัสเป็นครั้งแรกข้อมูลเพิ่มเติมก็มีประโยชน์เพียงเล็กน้อยเท่านั้น
นอกจากนี้ขึ้นอยู่กับการพัฒนาสภาพแวดล้อมของคุณ IDE อาจจะไม่สามารถที่จะให้คำแนะนำที่เป็นประโยชน์มากขึ้นและข้อมูลเกี่ยวกับกว่าChild
Parent
ข้อได้เปรียบ 3: โค้ดที่สะอาดและเป็นมาตรฐานมากขึ้น
ส่วนใหญ่ตัวอย่างรหัส C # ที่ผมเคยเห็นเมื่อเร็ว ๆ นี้ใช้ที่เป็นพื้นชวเลขvar
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
คำสั่งที่ไม่ใช่การประกาศก็ดูออกไป หากมีเหตุผลสถานการณ์สำหรับมันเจ๋ง แต่อย่างอื่นมันดูต่อต้านรูปแบบ
// 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();
ข้อได้เปรียบ 4: ตรรกะโปรแกรมที่ไม่แน่นอนเพิ่มเติมสำหรับการสร้างต้นแบบ
ข้อดีสามประการแรกคือขนาดใหญ่ สถานการณ์ยิ่งไกลของคนนี้
ยังสำหรับคนที่ใช้รหัสเหมือนคนอื่น ๆ ใช้ Excel เรากำลังเปลี่ยนรหัสของเราอยู่ตลอดเวลา บางทีเราไม่จำเป็นต้องเรียกวิธีการที่ไม่ซ้ำกันChild
ในรหัสรุ่นนี้แต่เราอาจปรับเปลี่ยนหรือปรับเปลี่ยนรหัสในภายหลัง
ข้อดีของระบบประเภทที่แข็งแกร่งคือให้เมตาดาต้าข้อมูลบางอย่างเกี่ยวกับตรรกะโปรแกรมของเราทำให้มีความเป็นไปได้ชัดเจนยิ่งขึ้น มันมีประโยชน์อย่างเหลือเชื่อในการสร้างต้นแบบดังนั้นจึงเป็นการดีที่สุดที่จะเก็บไว้ในที่ที่เป็นไปได้
สรุป
การใช้Parent
วิธีแก้ไขความละเอียดเมธอดที่มากเกินไปจะขัดขวางการปรับให้เหมาะสมของคอมไพเลอร์ลบข้อมูลออกจากเครื่องอ่านและทำให้โค้ดน่าเกลียด
การใช้var
เป็นวิธีที่จะไปจริงๆ มันรวดเร็วสะอาดมีลวดลายและช่วยให้คอมไพเลอร์และ IDE ทำงานได้อย่างถูกต้อง
สำคัญ : คำตอบนี้เกี่ยวParent
กับกับChild
ในขอบเขตของวิธีการ ปัญหาของParent
vs.Child
แตกต่างกันมากสำหรับประเภทส่งคืนข้อโต้แย้งและฟิลด์คลาส