แค่ตัวอย่างที่ฉันเคยใช้ในอดีต วิธีการที่ได้รับการป้องกันนั้นยอดเยี่ยมสำหรับการจัดทำฟังก์ชั่นการใช้งานเฉพาะขณะเดียวกันก็ช่วยให้ชั้นฐานสามารถติดตามสิ่งต่างๆ พิจารณาคลาสพื้นฐานที่จัดเตรียมฟังก์ชันการเตรียมข้อมูลเบื้องต้น overridable แต่ต้องมีสถานะเพื่อพิจารณาว่าการเตรียมใช้งาน:
class Base
{
private:
bool m_bInitialized;
public:
virtual void Initialize() = 0;
void setInitialized() { m_bInitialized = true; };
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
ทุกอย่างดีและดีที่นี่ ยกเว้นเมื่อคลาสที่ได้รับไม่รบกวนการโทรsetInitialized()
ไม่น้อยความจริงที่ว่าทุกคนสามารถเรียกมันได้ (เราสามารถทำให้การป้องกันนี้ที่นี่และอีกเหตุผลที่จะใช้วิธีการป้องกัน!) ฉันชอบคลาสที่ใช้ประโยชน์จากสมาชิกที่ได้รับการปกป้องเสมือน:
class Base
{
private:
bool m_bInitialized;
protected:
virtual void InitializeImpl() = 0;
public:
void Initialize()
{
InitializeImpl();
m_bInitialized = true;
}; // eo Initialize
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
ในคลาสใหม่ของเราการกำหนดค่าเริ่มต้นทั้งหมดยังคงมอบให้กับคลาสที่ได้รับ มีข้อยกเว้นตามที่ถูกโยนเรารักษาสัญญา "ชั้นนี้เริ่มต้นได้" ที่วิธีการของเราบอกว่าจะเกิดขึ้น