2014-09-08 2 views
0

У меня есть один класс Bicycle, который является родительским. Я хочу иметь два подкласса для переднего колеса и заднего колеса. Есть ли способ создать только один экземпляр суперкласса, а затем создать два отдельных экземпляра подкласс, которые делят только один экземпляр суперкласса. В основном велосипед - один, но колеса - два, и поэтому общие переменные велосипеда должны создаваться только один раз. Я хотел бы пойти на отношения IS-A, чтобы я мог повторно использовать множество переменных и методов. Также я не могу использовать статику здесь, потому что каждый велосипед - это другой экземпляр.Два подкласса Совместное использование только одного экземпляра переменной суперкласса

Ex:

class Bicycle { 
    String name; 
    int year; 
    double price; 
} 

class FrontWheel extends bicycle { 
    double wheelSize; 
} 

class BackWheel extends bicycle { 
    double wheelSize; 
} 

В основной программе, если я создаю экземпляры FrontWheel и BackWheel, очевидно, два набора общих переменных (год, название и т.д.) становятся созданы правильно. Во всяком случае, чтобы избежать дублирования распределения памяти для общих переменных? Любые другие варианты, доступные в Java?

+2

Зачем колесо удлиняет велосипед? Это как сказать, что нога расширяет человека, это просто неправда. – Kayaman

+1

Вы должны использовать * has-a * отношения. * состав/агрегация *, ваш основной дизайн неправильный. – TheLostMind

ответ

4

FrontWheelне a Bicycle, но велосипед содержит два колеса! Это пример неправильного использования наследования.

У вас должны быть экземпляры FrontWheel и BackWheel in a Bycicle.

Поэтому, например

class Bicycle { 
    String name; 
    int year; 
    double price; 
    Wheel frontWheel,rearWheel; 
} 

class Wheel{ 
    protected double wheelSize; 
} 
+0

OK согласился, что приведенный мной пример не применяется в этом случае. Но все же возможно создать только один экземпляр суперкласса, а затем создать два отдельных экземпляра подклассов, в которых используется только одна переменная экземпляра суперкласса. Пример: Wheel.make распространен для подкласс класса Wheel1 и Wheel2 of Wheel. Классы Wheel1 и Wheel2 имеют свои атрибуты, такие как диаметр, цена и т. Д. –

0

Наследование изображает IS-Отношения в плане специализации. Специальный велосипед можно было унаследовать от велосипеда, но колесо не может быть специализацией на велосипеде.

class FrontWheel; // forward declaration 
class BackWheel ; // forward declaration 
class Bicycle { 
String name; 
int year; 
double price; 
Frontwheel f; // aggregation or composition to be precise 
BackWheel b; // aggregation or composition to be precise 
} 

class FrontWheel { 
Bicycle b; // member of which Bicycle 
double wheelSize; 
} 

class BackWheel { 
Bicycle b; // member of which Bicycle 
double wheelSize; 
}