2012-04-21 4 views
0

Рассмотрим диаграмму классов:Design Issue: Пытаясь избежать дублирования кода при использовании Consts

enter image description here

Автомобиль имеет постоянную скорость макс 200 км в час, и автобус 100 км в час. Я представляю это как поле const maxSpeed ​​в подклассе;

Как заставить getMaxSpeed ​​() вернуть эту константу. Это простой пример только для иллюстрации моей проблемы, поэтому дублирование getMaxSpeed ​​() для каждого подкласса мне не поможет.

Есть ли способ сделать это?

Я уже рассматривал решение избежать consts и использования виртуальных свойств, но тогда каждый экземпляр класса будет содержать поле maxSpeed, что является пустой тратой пространства.

+4

Вам не нужно поле для виртуального объекта. Просто сделайте это 'virtual int MaxSpeed ​​{get {return 200; }} ' – knittl

+0

, это правильно. который пахнет решением, хотя тогда есть вызов функции. Я хотел, чтобы consts заставил компилятор имплантировать эти числа для меня – wolfovercats

+0

Если вы хотите 'const', он не может быть виртуальным. Компилятор не может встроить константу из производного класса. – Gabe

ответ

2

Весь смысл делать что-то виртуальное, это то, что вы не знаете во время компиляции, какой метод вызывать, поэтому нет никакого способа const может быть virtual. Типичным решением для этого является наличие abstract public double MaxSpeed { get; } в вашем базовом классе, а затем override public double MaxSpeed { get { return 200; } } в вашем производном классе .

Это решение позволяет сложный JIT компилятор, чтобы определить, что конкретный экземпляр Vehicle всегда Car и быть в состоянии вставит вызов get_MaxSpeed метод (как вы надеялись), в то же время позволяя каждое транспортное средство, чтобы иметь свой собственный максимум скорость.

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