ในความเป็นจริง C # ให้ความเป็นไปได้ที่จะได้รับพฤติกรรมเดียวกันในวิธี OOP บริสุทธิ์โดยไม่ต้องใช้คำพิเศษ - มันเป็นอินเตอร์เฟซส่วนตัว
เท่าที่คำถามเพื่อนคืออะไรเทียบเท่า C #? ถูกทำเครื่องหมายว่าซ้ำกับบทความนี้และไม่มีใครเสนอการก่อให้เกิดผลดีจริง ๆ - ฉันจะแสดงคำตอบสำหรับคำถามทั้งสองที่นี่
แนวคิดหลักเกิดขึ้นจากที่นี่: อินเทอร์เฟซส่วนตัวคืออะไร
สมมติว่าเราต้องการคลาสที่สามารถจัดการอินสแตนซ์ของคลาสอื่นและเรียกวิธีพิเศษบางอย่างกับพวกเขา เราไม่ต้องการให้ความเป็นไปได้ที่จะเรียกวิธีการนี้กับชั้นเรียนอื่น ๆ นี่คือสิ่งเดียวกันกับสิ่งที่เพื่อนของคำหลัก c ++ ทำในโลก c ++
ฉันคิดว่าตัวอย่างที่ดีในการใช้งานจริงอาจเป็นรูปแบบ Full State Machine ซึ่งคอนโทรลเลอร์บางตัวอัพเดตออบเจ็กต์สถานะปัจจุบันและเปลี่ยนเป็นออบเจ็กต์สถานะอื่นเมื่อจำเป็น
คุณสามารถ:
- วิธีที่ง่ายที่สุดและเลวร้ายที่สุดในการทำให้วิธีการ Update () เป็นแบบสาธารณะ - หวังว่าทุกคนจะเข้าใจว่าทำไมจึงไม่ดี
- วิธีถัดไปคือทำเครื่องหมายว่าเป็นภายใน มันดีพอถ้าคุณใส่คลาสของคุณไปยังชุดประกอบอื่น แต่ถึงแม้ว่าแต่ละคลาสในชุดประกอบนั้นจะสามารถเรียกแต่ละวิธีภายในได้
- ใช้อินเทอร์เฟซส่วนตัว / ป้องกัน - และฉันทำตามวิธีนี้
Controller.cs
public class Controller
{
private interface IState
{
void Update();
}
public class StateBase : IState
{
void IState.Update() { }
}
public Controller()
{
//it's only way call Update is to cast obj to IState
IState obj = new StateBase();
obj.Update();
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
//it's impossible to write Controller.IState p = new Controller.StateBase();
//Controller.IState is hidden
var p = new Controller.StateBase();
//p.Update(); //is not accessible
}
}
แล้วมรดกล่ะ
เราจำเป็นต้องใช้เทคนิคที่อธิบายไว้ในเนื่องจากการใช้งานสมาชิกอินเทอร์เฟซที่ชัดเจนไม่สามารถประกาศเสมือนและทำเครื่องหมาย IState ว่าได้รับการป้องกันเพื่อให้ความเป็นไปได้ที่จะได้รับจากตัวควบคุมเช่นกัน
Controller.cs
public class Controller
{
protected interface IState
{
void Update();
}
public class StateBase : IState
{
void IState.Update() { OnUpdate(); }
protected virtual void OnUpdate()
{
Console.WriteLine("StateBase.OnUpdate()");
}
}
public Controller()
{
IState obj = new PlayerIdleState();
obj.Update();
}
}
PlayerIdleState.cs
public class PlayerIdleState: Controller.StateBase
{
protected override void OnUpdate()
{
base.OnUpdate();
Console.WriteLine("PlayerIdleState.OnUpdate()");
}
}
และสุดท้ายตัวอย่างวิธีการทดสอบคลาส Controller โยนมรดก:
ControllerTest.cs
class ControllerTest: Controller
{
public ControllerTest()
{
IState testObj = new PlayerIdleState();
testObj.Update();
}
}
หวังว่าฉันจะครอบคลุมทุกกรณีและคำตอบของฉันมีประโยชน์