ย้อนกลับไปในยุค 2000 เพื่อนร่วมงานคนหนึ่งของฉันบอกฉันว่ามันเป็นรูปแบบการต่อต้านเพื่อทำให้วิธีการสาธารณะเสมือนหรือนามธรรม
ตัวอย่างเช่นเขาถือว่าคลาสเช่นนี้ไม่ได้ออกแบบมาอย่างดี:
public abstract class PublicAbstractOrVirtual
{
public abstract void Method1(string argument);
public virtual void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
// default implementation
}
}
เขากล่าวว่า
- นักพัฒนาของคลาสที่ได้รับที่ใช้
Method1
และการแทนที่Method2
มีการทำซ้ำการตรวจสอบอาร์กิวเมนต์ - ในกรณีที่ผู้พัฒนาคลาสพื้นฐานตัดสินใจที่จะเพิ่มบางสิ่งรอบ ๆ ส่วนที่กำหนดเองได้
Method1
หรือMethod2
ใหม่กว่าเขาจะไม่สามารถทำได้
เพื่อนร่วมงานของฉันเสนอวิธีการนี้แทน:
public abstract class ProtectedAbstractOrVirtual
{
public void Method1(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method1Core(argument);
}
public void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method2Core(argument);
}
protected abstract void Method1Core(string argument);
protected virtual void Method2Core(string argument)
{
// default implementation
}
}
เขาบอกให้ฉันสร้างวิธีการสาธารณะ (หรือคุณสมบัติ) เสมือนหรือนามธรรมไม่ดีเท่าการทำให้ฟิลด์เป็นสาธารณะ โดยการรวมฟิลด์ลงในคุณสมบัติหนึ่งสามารถตัดการเข้าถึงฟิลด์นั้นในภายหลังได้หากจำเป็น เช่นเดียวกับสมาชิกเสมือน / นามธรรมสาธารณะ: ล้อมรอบพวกเขาตามที่แสดงในProtectedAbstractOrVirtual
ชั้นเรียนช่วยให้ผู้พัฒนาคลาสฐานดักสายที่ไปที่วิธีเสมือน / นามธรรม
แต่ฉันไม่เห็นว่านี่เป็นแนวทางการออกแบบ แม้แต่ Microsoft ก็ไม่ทำตามมันแค่ดูที่Stream
คลาสเพื่อตรวจสอบสิ่งนี้
คุณคิดอย่างไรกับแนวทางนี้ มันสมเหตุสมผลหรือไม่หรือคุณคิดว่ามันซับซ้อนเกินไป API?
protected
มีประโยชน์มากที่สุดเมื่อคุณต้องการให้สมาชิกส่วนตัวของคลาสนามธรรมเป็นคลาสที่ได้รับ ไม่ว่าในกรณีใดฉันไม่ได้กังวลเป็นพิเศษเกี่ยวกับความคิดเห็นของเพื่อนของคุณ เลือกตัวปรับการเข้าถึงที่เหมาะสมที่สุดสำหรับสถานการณ์เฉพาะของคุณ
virtual
ช่วยให้เอาชนะทางเลือก วิธีการของคุณอาจเป็นแบบสาธารณะเนื่องจากอาจไม่ถูกแทนที่ ทำให้วิธีการabstract
บังคับให้คุณแทนที่พวกเขา; พวกเขาควรจะเป็นprotected
เพราะพวกเขาไม่ได้มีประโยชน์โดยเฉพาะอย่างยิ่งในpublic
บริบท