2012-05-10 3 views
2

У меня есть массив ячеек Matlab объектов, что-то вроде:испытаний существование на объектах

objs = {Object1(), Object2(), Object3()}; 

Эти объекты являются все различные типы. У некоторых из них будет метод, назовем его myMethod(). Я хочу сделать что-то вроде:

for o = objs 
    if hasMethod(o, 'myMethod()') 
    o.myMethod(); 
    end 
end 

и моя трудность заключается в том, что я не знаю, как это сделать hasMethod - exist не кажется полезным здесь.

Я мог бы использовать try - catch, но я предпочел бы сделать что-нибудь опрятное. Есть ли способ сделать это? Должен ли я просто изменить свой дизайн?

ответ

3

Другой вариант - использовать класс мета.

obmeta = metaclass(ob); 
    methodNames = cellfun(@(x){x.Name},obmeta.Methods); 

Вы также можете получить дополнительную информацию от obmeta.Methods как

  • Количество параметров ввода/вывода.
  • Тип доступа
  • В каком классе определяется метод.

Кроме того, metaclass может быть построен из названия класса без экземпляра, который может быть преимуществом в некоторых ситуациях.

1

Зачем вам это нужно? Лучше иметь вескую причину: p

Лучше наследуйте общую функцию от суперкласса. Затем вы можете просто вызвать эту функцию для всех из них, вместо того, чтобы посмотреть, какой класс он/проверяет, существует ли функция, а затем вызывает функцию в зависимости от результата (что является не очень OO)

+0

Да, это похоже на странную вещь, но если Matlab дает нам разнородные коллекции, было бы стыдно не использовать их: -D. Поскольку этот метод имеет смысл только для некоторых классов, было бы нецелесообразно иметь его в суперклассе.Решение проблемы в правильном способе OO потребовало бы, чтобы я внес изменения в множество классов, чтобы я мог различать те, у кого есть метод и без него. Я бы предпочел использовать хакерский стиль отражения в заявлении :-) – Richante

3

Ah, found Это. Не очень интересно - вы можете получить список методов с помощью команды methods. Поэтому, чтобы проверить, есть ли у объекта метод,

if any(strcmp(methods(o), 'myMethod')) 
    o.myMethod(); 
end 
+1

Это была моя первая мысль, вручную добавить функцию 'getMethods' в каждый класс, который возвращает все методы, не упоминал из-за уродства, которое могло бы сделать , Приятно знать, что уже существует такая вещь: p Кстати, вы также можете использовать 'ismember ('myMethod', methods (o))' –

0

Один простой вариант заключается в использовании функции EXIST (наряду с функцией CLASS), чтобы проверить, если метод существует для данного класса:

if exist(['@' class(o) '/myMethod']) 
    o.myMethod(); 
end 

Другой вариант заключается в использовании функция WHICH для выполнения проверки например:

if ~isempty(which([class(o) '/myMethod'])) 
    o.myMethod(); 
end 
+1

Я думаю, что они работают только для классов pre-7.6, где есть @ класса? – Richante

2

Очень близко! Если бы вы написали имя функции немного по-другому ты бы наткнулся на следующий встроенный:

if ismethod(o, 'myMethod') 
    o.myMethod(); 
end 

Документация: ismethod.

Смежные вопросы