2013-05-11 2 views
0

Я довольно новичок в Java, у меня есть связанныйList класса ObjectType, у меня есть разные подклассы ObjectType, которые добавляются в связанныйList, когда я вытаскиваю объект из-за меня вынужден передать ему тип ObjectType и, похоже, теряют унаследованные свойства подкласса ... Может ли кто-нибудь пролить свет на это для меня?Java LinkedList Наследование объектов overriden

//LIST STORING OBJECT 
public class MyObjectList{ 

    private LinkedList<ObjectType> queue = new LinkedList<ObjectType>(); 

    public MyObjectList() 
    { 
     queue = new LinkedList<ObjectType>(); 
    } 

    public ObjectType addObject(ObjectType myObject) 
    { 
     queue.add(myObject); 
     return myObject; 
    } 

} 

//MY BASIC OBJECT 
public abstract class ObjectType { 

    public int objectWidth; 

    public ObjectType() {} 
} 

//MY EXTENDED OBJECT BOX 
public abstract class Box extends ObjectType { 

    public int objectWidth = 50; 

    public ObjectType() {} 
} 

//MY EXTENDED OBJECT PLATE 
public abstract class Box extends ObjectType { 

    public int objectWidth = 25; 

    public Box() {} 
} 

// ОК, так что теперь, если я добавлю количество ящиков в свой список ящиков, их значение будет установлено на нуль!

mList = new MyObjectList; 

for (int i=0;i<10;i++) 
{ 
    mObject = mList.addObject(new Box); 
} 

Важно помнить, что мой список должен быть составлен из различных типов объектов, в конечном счете, так что BaseObject должен оставаться как есть. если возможно!

+0

Вы не можете добавить 'new Box()' is is abstract. Можете ли вы привести пример, который компилируется и запускается? –

ответ

2

Вы не можете переопределить поля в Java, так что если вы хотите установить objectWidth к 50 в подклассе, вы могли бы сделать это следующим образом:

public abstract class ObjectType { 
    public int objectWidth; 
    public ObjectType() {} 
} 

public abstract class Box extends ObjectType { 
    public Box() { 
     objectWidth = 50; 
    } 
} 
+1

Как не относящийся к теме вопрос, инкапсуляция данных отсутствует здесь. Поле objectWidth должно быть закрытым, а публичные геттеры/сеттеры должны быть в месте абстрактного класса - переопределены, если необходимо, в классе Box. – Mena

+0

Спасибо всем за их ответы! Я многому научился. @Mena, если у меня много свойств, класс не получает большой код, тяжелый, делающий геттеры и сеттеры для каждого свойства? Каковы преимущества перед просто установкой его напрямую, а не с использованием метода? Благодаря!! –

+0

@JulianYoung Я знаю, что он может казаться загроможденным, чтобы иметь много свойств и их геттеры/сеттеры вокруг, особенно когда эти геттеры/сеттеры выполняют самые базовые операции, без манипуляций с аргументами или результатами соответственно. Тем не менее, по мере развития вашего кода, вы можете очень сожалеть о том, чтобы разрешить публичные поля как таковые (например, нужно проверить нули и т. Д.). Если вы пришли из C#, подумайте об этом, хотя код _seems_, чтобы побудить вас объявлять публичные свойства, на самом деле это не так. См. Также: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) – Mena

1

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

Один из способов решения этой проблемы - дать вашему абстрактному классу метод, например. getObjectWidth(), и переопределить это в каждом подклассе. Поскольку методы могут быть переопределены, таким образом, конкретное значение будет показано для каждого объекта.

0

Лучше образец, чтобы использовать константу в классе, как.

//MY BASIC OBJECT 
public abstract class ObjectType { 

    public abstract int objectWidth(); 

    public ObjectType() {} 

} 

//MY EXTENDED OBJECT BOX 
public class Box extends ObjectType { 

    public int objectWidth() { return 50; } 

    public ObjectType() {} 
} 
Смежные вопросы