Кастинг Объекты, которые наследуют

Допустим, у меня есть 3 очень простых объекта: Automobile, Car, Coach (чтобы все было просто).

Автомобиль имеет свойства:

Id / EngineSize / WheelCount / TopSpeed

Автомобиль унаследовал от Automobile и обладает дополнительными свойствами

NumberOfDoors / NumberOfSeats

Тренер наследует от Automobile и обладает дополнительными свойствами

NumberOfPassengers / MaxLuggageWeight

Теперь позвольте сказать, что я получаю свой объект через Id, и я создаю базовый вспомогательный метод, например, чтобы получить свой объект

HelperMethod.GetTransport(pId AS Integer) AS OBJECT

Теперь этот метод вернет либо объект Car, либо Coach.

Если я хочу установить свойство на этом объекте, который находится внутри класса Automobile, я просто бросаю объект, который возвращается как объект Automobile, например

Dim lMyObject AS Automobile = HelperMethod.GetTransport(1)
lMyObject.EngineSize = 1000

Или я должен создать интерфейс IAutomobile, который базовый класс Automobile будет реализовывать и отбрасывать возвращаемый объект таким образом:

Dim lMyObject AS IAutomobile = HelperMethod.GetTransport(1)
lMyObject.EngineSize = 1000

Если есть лучший способ сделать это? Правильны ли они оба, и только до программиста? По какой-то причине я считаю, что интерфейс звучит правильно, но я не уверен на 100%.

Расширить, почему это немного. Причина этого заключается в том, что у меня есть веб-приложение, в котором пользователи могут настраивать эти свойства объекта. Некоторые веб-страницы используются для обоих объектов, потому что страницы содержат только поля, которые находятся в "базовом" классе Automobile. На этих страницах я просто хочу знать, как я должен бросать объект, чтобы установить свойства в базовом классе. Я должен либо сделать

Dim lTransport AS Automobile = HelperMethod.getTransport(1)
lTransport.EngineSize = 1000

ИЛИ

Dim lTransport AS IAutomobile = HelperMethod.getTransport(1)
lTransport.EngineSize = 1000
1 ответ

Что такое IAutomobile - вы не упоминали наличие интерфейса, а также абстрактного базового класса.

Во всяком случае, в вашем примере EngineSize является членом базового класса, поэтому вы должны иметь возможность назначить его прямо в переменной Automobile без какого-либо явного приведения. Однако, если вы хотите установить какое-то определенное поле, например NumberOfDoors вас есть несколько вариантов. Во-первых, есть ваш вариант 1: просто GetAutomobile результат GetAutomobile в Car. Но, честно говоря, я обычно считаю, что нужно знать, что производный тип является недостатком в дизайне, и стараться избегать его вообще - ведь зачем вы пытаетесь работать с Automobile если вам нужны конкретные свойства в зависимости от типа автомобиля? В этом случае было бы лучше иметь отдельный метод Helper.GetCar и Helper.GetCoach которые завершают проверку и гарантированно возвращают правильный тип объекта, поэтому вы также можете назначить его непосредственно Car.

licensed under cc by-sa 3.0 with attribution.