2010-07-06 2 views
3

Я большой поклонник генерации кода (из UML) и исходящий из Java-мира, мне интересно, как реализовать автоматическое двунаправленное управление ассоциациями в Objective-C.Расширение NSMutableArray для управления двунаправленными ассоциациями

Образ ассоциации Partner < -> Адрес, один-ко-многим и судоходный с обоих концов. Я хотел бы добиться того, что если я добавлю адрес партнеру, адресный объект должен автоматически узнать о его партнере.

Таким образом, шаблон реализации должен иметь NSMutableArray * на стороне партнера и партнера * на стороне адреса. Свойство на стороне адреса легко реализовать, поскольку setPartner: (Partner *) aPartner может автоматически вставлять адрес (сам) в NSMutableArray партнера, управляющего адресами. Другая сторона, однако, не так просто реализовать. Стандартный шаблон реализации для многих ссылок в Objective-C, по-видимому, является NSMutableArray, доступным с помощью метода get @property. Объект, обладающий этим NSMutableArray, может затем вставить объект Address в массив, который, конечно же, не будет обновлять другую сторону.

Я знаю, что существуют другие шаблоны для такого управления ассоциациями, например, с помощью методов addTo ...() и removeFrom ...(). Но я еще не знаю, будет ли это соответствовать другим принципам программирования какао или даже не позволит эффективно использовать какао. Здесь я думаю о Interface Builder. Не так много опыта, но я видел что-то, называемое ArrayController, которое кажется довольно удобным, но, похоже, также ожидается, что свойство типа NSMutableArray будет работать. И если этот парень вставляет объекты в массив, мне нужно перехватить это и выполнить настройку другой стороны.

Как программист на Java, я хотел бы теперь подклассифицировать NSMutableArray и переопределить некоторые из его методов, которые затем могут манипулировать другим концом. Возможно ли это вообще? Я читал о категориях, но до сих пор я понял, что могу только добавить методы в класс таким образом, а не переопределять их и не добавлять в его структуру. Или это будет метод пересылки? Сейчас я запутался. Если бы вы могли указать мне правильное направление мышления, это было бы так здорово. Большое спасибо!

ответ

9

Добро пожаловать в Какао. Не подклассы встроенных коллекций. Вы сойдете с ума.

Позвольте мне уточнить: в Какао у нас есть такие вещи, которые называются "Class Clusters". Кластеры - это иерархия частных классов, в которых все имеют общий публичный суперкласс. В этом случае NSArray является публичным суперклассом, и есть частные подклассы, которые являются фактическими реализациями массива. Это представляет собой действительно сложную задачу при подклассификации, потому что вы не знаете, какой класс (или классы) вам нужен для подкласса.

Общая задача заключается в создании нового подкласса NSObject, который «обертывает» NSArray (т. Е. Он имеет массив как переменную экземпляра ["field"]), а затем вы вызываете методы в пользовательской оболочке, и оболочка содержит всю необходимую логическую логику.

Что касается ответа на ваш вопрос, я обнаружил, что, когда у меня есть такая настройка, где мне нужно поддерживать отношения «один к одному», «один ко многим» или «многие ко многим», ничего, что бьет с помощью CoreData. CoreData - это встроенная среда, которая более или менее похожа на хранилище объектов. Одна из поистине удивительных вещей, которые она выполняет, - это целостность отношений с дескрипторами, что и есть то, что вы ищете.

+0

Дэйв, спасибо, что спасли меня от изучения этого трудного пути - я клянусь, что никогда больше не буду думать о расширении классов коллекций;) Я сейчас поближе посмотрю на CoreData. Кажется, он не поддерживает наследование, но для большинства частей моих моделей данных это будет нормально.Надеюсь, он сможет обрабатывать большие объемы данных (в двоичной форме). Еще раз спасибо! –

+0

уже выяснил, что он может наследовать. идеально!!! –

+0

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

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