Можем ли мы иметь протокол с реализацией?

Я хочу установить singletonProtocol. Классы, реализующие этот протокол, будут поддерживать + (id) singleton

Очевидно, что я реализую этот метод однопользовательского режима. Это пустая трата, чтобы повторять одно и то же снова и снова.

I can use inheritance, I already knows how to do it, but a class can only have one parent and using inheritance sounds like an overkill. Basically I will just store the singletons in an NSMutableDictionary whose key is the NSStringFromClass of the respective class. I wonder why no one else do that. It's the same technique I used for Inobjective-chow can we have a variable whose scope is the whole class (but doesn't include subclasses)

#import "BGSuperSingleton.h"

static NSMutableDictionary * allTheSingletons;
@implementation BGSuperSingleton

+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    id result = allTheSingletons[className];

    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
    }
    return result;
}

@end

Я могу использовать категорию. Однако категория работает практически для любых классов. Я могу ограничить, что все мои синглеты принадлежат классу SuperSingleton, но это может привести к поражению цели

Я могу использовать протокол. Теперь это потрясающе. Однако протокол не имеет реализации. Протокол только объявляет метод, который может выполнять класс.

И что же мне делать?

3
добавлено отредактировано
Просмотры: 1
de

1 ответы

Итак, что мне делать?

Вы должны пересмотреть свой дизайн. Похоже, вы хотите принять этот протокол в нескольких разных классах, чтобы иметь общий экземпляр каждого из этих классов. Действительно ли эти объекты действительно нуждаются в одиночку? Существует разница между общим объектом и классом, который не должен быть создан несколько раз.

Подумайте о создании класса, который действует как фабрика для всех других классов. Этот класс может поддерживать словарь общих объектов, и вы можете просто использовать фабрику для создания экземпляров других классов. В самом деле, вы можете написать другие классы, чтобы их экземпляр напрямую вызывал исключение или что-то еще.

3
добавлено
Это будет другой подход. Класс с эффективными количествами однотонных.
добавлено автор Sharen Eayrs, источник