Создание абстрактного класса в Objective-C

Более простой способ - предоставить свойство data как объект:

$.ajax({
  url: 'mysite/save',
  type: 'POST',
  data: { param0:'hi there!', param1:'blah blah', param2:'we get it' }
});

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

Вы также можете выделить его и получить свойства из других мест внутри, например:

$.ajax({
  url: 'mysite/save',
  type: 'POST',
  data: { 
          param0: $('#textbox0').val(), 
          param1: $('#textbox1').val(), 
          param2: $('#textbox2').val()
        }
});

Редактировать: Если вам интересно, как jQuery делает эту кодировку внутри себя, она использует $.param() (которую вы также можете использовать напрямую) для кодирования объекта к строке, названной здесь здесь , и кишки здесь .

499
задан Peter Mortensen 29 October 2016 в 11:28
поделиться

4 ответа

Обычно классы Objective-C абстрактны только по соглашению - если автор документирует класс как абстрактный, просто не используйте его, не создав подклассы. Однако не существует принудительного исполнения во время компиляции, которое предотвращало бы создание абстрактного класса. Фактически, ничто не мешает пользователю предоставлять реализации абстрактных методов через категорию (то есть во время выполнения). Вы можете заставить пользователя хотя бы переопределить определенные методы, вызвав исключение в реализации этих методов в вашем абстрактном классе:

[NSException raise:NSInternalInconsistencyException 
            format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];

Если ваш метод возвращает значение, его немного проще использовать

@throw [NSException exceptionWithName:NSInternalInconsistencyException
                               reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
                             userInfo:nil];

, поскольку тогда вам не нужно для добавления оператора возврата из метода.

Если абстрактный класс действительно является интерфейсом (т.е. не имеет конкретных реализаций метода), использование протокола Objective-C является более подходящим вариантом.

627
ответ дан 22 November 2019 в 22:37
поделиться

Из списка рассылки Omni Group :

Objective-C не имеет абстрактной конструкции компилятора, такой как Java, на на этот раз.

Итак, все, что вам нужно сделать, это определить абстрактный класс как любой другой нормальный класс. и реализовать методы-заглушки для абстрактных методов, которые либо пусто или сообщить о том, что селектор не поддерживается. Например ...

- (id)someMethod:(SomeObject*)blah
{
     [self doesNotRecognizeSelector:_cmd];
     return nil;
}

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

- (id)init
{
     [self doesNotRecognizeSelector:_cmd];
     [self release];
     return nil;
}
35
ответ дан 22 November 2019 в 22:37
поделиться

Нет, нет способа создать абстрактный класс в Objective-C.

Вы можете имитировать абстрактный класс, сделав вызов методов / селекторов doesNotRecognizeSelector: и, следовательно, вызвать исключение сделать класс непригодным для использования.

Например:

- (id)someMethod:(SomeObject*)blah
{
     [self doesNotRecognizeSelector:_cmd];
     return nil;
}

Вы также можете сделать это для init.

267
ответ дан 22 November 2019 в 22:37
поделиться

Instead of trying to create an abstract base class, consider using a protocol (similar to a Java interface). This allows you to define a set of methods, and then accept all objects that conform to the protocol and implement the methods. For example, I can define an Operation protocol, and then have a function like this:

- (void)performOperation:(id<Operation>)op
{
   // do something with operation
}

Where op can be any object implementing the Operation protocol.

If you need your abstract base class to do more than simply define methods, you can create a regular Objective-C class and prevent it from being instantiated. Just override the - (id)init function and make it return nil or assert(false). It's not a very clean solution, but since Objective-C is fully dynamic, there's really no direct equivalent to an abstract base class.

21
ответ дан 22 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: