แอปพลิเคชันที่มีประโยชน์ที่สุดที่ฉันพบคือการใช้โรงงาน ในหลายกรณีจะเป็นประโยชน์ในการสร้างคลาสที่ไม่แน่นอนภายในโรงงาน แต่ไม่เปลี่ยนรูปเป็นคลาสภายนอก สิ่งนี้สามารถนำไปใช้ใน Java ได้อย่างง่ายดายโดยใช้คลาสภายในโดยการทำให้ฟิลด์และ setters เป็นแบบส่วนตัวและเปิดเผยตัวรับเป็นสมาชิกสาธารณะเท่านั้น อย่างไรก็ตามใน C # ฉันต้องใช้อินเทอร์เฟซที่ชัดเจนเพื่อให้ได้สิ่งเดียวกัน ฉันจะอธิบายเพิ่มเติม:
ใน Java ชั้นในและชั้นนอกสามารถเข้าถึงสมาชิกส่วนตัวของกันและกันซึ่งทำให้รู้สึกโดยรวมเนื่องจากชั้นเรียนมีความสัมพันธ์กันอย่างใกล้ชิด พวกเขาอยู่ในไฟล์รหัสเดียวกันและอาจพัฒนาโดยนักพัฒนาเดียวกัน ซึ่งหมายความว่าโรงงานและวิธีการส่วนตัวในชั้นในยังสามารถเข้าถึงได้โดยโรงงานเพื่อปรับเปลี่ยนค่าของพวกเขา แต่คลาสภายนอกจะไม่สามารถเข้าถึงฟิลด์เหล่านี้ได้ยกเว้นผ่านตัวรับข้อมูลสาธารณะ
อย่างไรก็ตามใน C # คลาสภายนอกไม่สามารถเข้าถึงสมาชิกส่วนตัวของคลาสภายในเพื่อให้แนวคิดนั้นไม่สามารถใช้ได้โดยตรง ฉันใช้อินเทอร์เฟซที่ชัดเจนเป็นวิธีแก้ปัญหาโดยการกำหนดอินเทอร์เฟซส่วนตัวในคลาสภายนอกและนำไปใช้อย่างชัดเจนในคลาสภายใน วิธีนี้มีเพียงคลาสภายนอกเท่านั้นที่สามารถเข้าถึงวิธีการในอินเทอร์เฟซนี้เช่นเดียวกับที่ทำใน Java (แต่ต้องเป็นวิธีการไม่ใช่สาขา)
ตัวอย่าง:
public class Factory
{
// factory method to create a hard-coded Mazda Tribute car.
public static Car CreateCar()
{
Car car = new Car();
// the Factory class can modify the model because it has access to
// the private ICarSetters interface
((ICarSetters)car).model = "Mazda Tribute";
return car;
}
// define a private interface containing the setters.
private interface ICarSetters
{
// define the setter in the private interface
string model { set; }
}
// This is the inner class. It has a member "model" that should not be modified
// but clients, but should be modified by the factory.
public class Car: ICarSetters
{
// explicitly implement the setter
string ICarSetters.model { set; }
// create a public getter
public string model { get; }
}
}
class Client
{
public Client()
{
Factory.Car car = Factory.CreateCar();
// can only read model because only the getter is public
// and ICarSetters is private to Factory
string model = car.model;
}
}
นั่นคือสิ่งที่ฉันจะใช้อินเทอร์เฟซที่ชัดเจนสำหรับ