2010-04-29 2 views
0

У меня есть несколько видов объектов, например Car.Как реализовать несколько видов объектов в ООП?

Есть ли у меня каждый вид в унаследованном классе/подклассе Car?

Должен ли я разместить их под пространством имен cartype, чтобы не испортить основное пространство имен?

Затем, когда мне понадобится массив автомобилей, я должен объявить его var currentCars():Car или var currentCars():Object? Будут ли прежние поддерживать какой-либо подкласс автомобиля?

ответ

5

Конкретные ответы трудно, потому что они действительно зависят от особенностей вашей проблемы пространства, но в целом вы должны использовать подклассы от Car, если все виды Car поделились некоторыми функциями. Например:

public class Car { 
    public void Start() { } 
} 

И тогда вы могли бы иметь различные типы Car:

public class Sedan : Car { 
    public void OpenAllFourDoors() { } 
} 

public class Coupe : Car { 
    public void OpenAllTwoDoors() { } 
} 

Вам вообще не нужно ставить иерархию классов в своем собственном пространстве имен, есть и другие наборы для указания имен определения. Как правило, ожидают, что пространства имен будут иметь форму чего-то типа CompanyName.ProductName.ModuleName или что-то подобное.

Позже, когда вам понадобится массив (или, чаще всего, коллекция) автомобилей, вы должны создать коллекцию Car. Если вы возьмете ссылку из этой коллекции, вы не сможете получить OpenAllFourDoors или OpenAllTwoDoors, потому что вы не узнаете, какой подкласс Car вы работаете.

(Извинения для C# заточенного синтаксис)

+0

я не могу держать «своего рода» свойство в пределах каждого подкласса (значение по умолчанию на подкласс), чтобы знать, какой подкласс это? .. и какова разница между сборкой и массивом? –

+1

@Jeremy Rudd: Вы можете, но это вообще плохая форма. Воспользуйтесь виртуальной диспетчеризацией, чтобы устранить свойство «kind», иначе вы победите одну из основных мотивов иерархии классов. Например, положите 'OpenAllDoors()' на базовый класс 'Car', а затем пусть каждая реализация определит, как открыть все двери. –

+1

В большинстве языков OO, которые я использовал, Array - это языковая конструкция, используемая для хранения серии объектов. Коллекция (из которой существует много разных сортов) представляет собой более формальную структуру данных с понятными характеристиками производительности и интерфейсами. Например, связанный список представляет собой тип коллекции. –

1

У вас может быть небольшое число классов, наследуемых от вашего класса Car, если у вас нет переопределенных методов, которые конфликтуют.

Что касается пространств имен, я обычно помещаю классы, которые наследуются от другого, в одном и том же пространстве имен, но не уверен, что если они не находятся в одном пространстве имен, все же.

О, и когда вам нужен массив, вы объявляете его точно так же, как и любой другой тип данных.

Вы видите, когда вы объявляете автомобиль класса, вы создаете автомобиль типа данных.

Так что, когда вам нужно объявить массив автомобилей, вы идете, как это:

var currentCars():Car 
Смежные вопросы