Tôi có 2 lớp con kế thừa từ 'MyClass' và mỗi lớp con phải là một singleton.Tạo một lớp singleton với dispatch_once cho lớp hiearchy
Tôi đã sử dụng mô hình này để nhận một trường hợp tĩnh khi tôi không có bất kỳ lớp khác kế thừa:
+ (MyClass *)getInstance
{
static dispatch_once_t once;
static MyClass *instance;
dispatch_once(&once, ^{
instance = [[MyClass alloc] init];
});
return instance;
}
này hoạt động chỉ là tuyệt vời. Bây giờ, nếu tôi thêm hai lớp con mới, FirstClass và SecondClass, cả hai đều kế thừa từ MyClass, làm thế nào để đảm bảo rằng tôi lấy lại ChildClass tương ứng?
dispatch_once(&once, ^{
// No longer referencing 'MyClass' and instead the correct instance type
instance = [[[self class] alloc] init];
});
FirstClass *firstClass = [FirstClass getInstance]; // should be of FirstClass type
SecondClass *secondClass = [SecondClass getInstance]; // should be of SecondClass type
Làm ở trên có nghĩa là tôi luôn nhận lại bất cứ điều gì lớp tôi instantiated 1st as type lớp thứ hai của tôi:
first: <FirstClass: 0x884b720>
second: <FirstClass: 0x884b720>
// Note that the address and type as identical for both.
gì là cách tốt nhất để tạo ra các độc thân lớp con tương ứng mà không cần thêm getInstance
phương pháp để mỗi lớp con?
Lý do tôi có cấu trúc phân cấp này là tôi có số lượng mã và dữ liệu chung được chia sẻ mà tất cả các lớp con của tôi có (bên ngoài 'sharedInstance'. Đây cũng là lý do tại sao tôi sử dụng các giao thức kế thừa vs. không lặp lại cùng một mã khởi tạo cho cả ba lớp bắt nguồn –
+1 về cách đặt tên "get". –