Понимание интерфейсов и объектов в API

Поэтому я довольно часто использую API для Solidworks на работе, чтобы писать очень простые сценарии VBA для автоматизации задач. Это было действительно полезно, но сказать, что я не программист, — значит ничего не сказать. В настоящее время я борюсь с тем, почему все в API, кажется, имеет I перед своим именем.

Справочник по API находится здесь. I. Кажется, это работает так же или даже лучше, если я просто объявлю вещи, например, как Sldworks.ModelDoc2, а не IModelDoc2, как говорит API. Я немного погуглил, и, похоже, это как-то связано с интерфейсами и объектами, но я не совсем понимаю различие. Я чувствую, что упускаю что-то действительно очевидное, но оно еще не пришло ко мне.

Может ли кто-нибудь пролить свет на то, что делают «я» и почему без них все работает нормально?

Редактировать: В итоге я нашел это, что объясняет, что я делал в Solidworks API. Похоже, что это не совсем связано с интерфейсами.


person JDP    schedule 09.09.2015    source источник


Ответы (1)


Существует множество статей, объясняющих разницу между объектами и интерфейсами, но, насколько я понимаю, все сводится к следующему: интерфейсы отделяют поведение от реализации. Во многих случаях это используется для совместного использования разнородных объектов для одной и той же цели. Например, у вас могут быть классы Car, Bike, Truck, Boat, Train и Bus, которые очень разные, но если все они реализуют интерфейс ITransportation с одним методом transport(person, destination), мне не нужно заботиться о базовых различиях. перемещать людей.

Однако в данном случае я подозреваю, что интерфейс используется для обеспечения обратной совместимости в будущем. Предположим, что через 10-15 лет Solidworks достигнет уровня ModelDoc34. Если ваш код ожидает тот же набор свойств и функций, что и ModelDoc2, вы, скорее всего, будете разочарованы. Однако предположим, что ModelDoc34 реализует интерфейс IModelDoc2, то есть разработчики предоставляют ограниченный набор новых функций, точно совпадающий с набором свойств и функций старого класса ModelDoc2, чтобы ваш код мог выполняться до тех пор, пока когда вы ссылаетесь на новое имя класса. В том же духе, что и в предыдущей аналогии, представьте, что это 50 лет в будущем. В автомобилях больше нет ручного управления, вы просто вводите пункт назначения и вперед. Если бы разработчики хотели сделать этот автомобиль обратно совместимым, они могли бы реализовать интерфейс IStandardCar, который включал бы такие вещи, как педали газа/тормоза и руль.

Если вы хотите, чтобы ваш код был максимально ориентирован на будущее, вы должны объявить свои переменные типа IModelDoc2. Пусть API Solidworks выяснит, каким будет базовый тип объекта, и вы сможете написать свой код, как если бы он всегда был просто ModelDoc2.

person Blackhawk    schedule 09.09.2015
comment
Спасибо, это очень полезно. Я немного читал об объектах и ​​интерфейсах, и ваши примеры действительно полезны, но почему-то это все еще не совсем в фокусе. Я думаю, что это во многом связано с моим шатким знанием объектно-ориентированных языков в целом. У меня также возникают проблемы с поиском практически любых объектов в API, на который я смотрю. Может быть, это сделано намеренно по причинам, которые вы упоминаете. - person JDP; 09.09.2015
comment
У меня нет Solidworks, но я предполагаю, что объекты отображаются как единая иерархия. Будет родительский объект Solidworks, а все остальные объекты будут уровнями дочерних объектов ниже него. - person Blackhawk; 09.09.2015
comment
@JamesPettit Например, в Excel вы можете создавать фигуры. Предположим, я создал круг на листе 1 книги Excel по умолчанию через вкладку ленты «Вставка». Затем я бы ссылался на него в коде Excel.Sheets(1).Shapes(1). Вы не могли бы просто написать Dim thing as Shape; Set thing = new Shape для создания новой формы, потому что формы должны существовать на определенном рабочем листе — они не могут существовать в абстрактном смысле. Вместо этого вы должны позволить иерархии создать его для вас, автоматически связывая его с родительским объектом: Excel.Sheet(1).Shapes.AddShape() - person Blackhawk; 09.09.2015