Reputation: 6362
I'm creating a complex data type. It's an ArrayList (chapters) of ArrayLists (chapter). However, there are two versions of the chapter, each with it's respected elements and data types.
How could I declare my complex data type so I could add one or another (to have, e.g., ArrayList(chapters) which contains (chapter_typeI,chapter_typeII,chapter_typeII,chapter_typeI,chapter_typeII, etc...)?
Upvotes: 1
Views: 2659
Reputation: 19185
It is always better to create List of types than actual object if you have clear hierarchy defined.
List<Type> list = new ArrayList<Type>();
Now Type can be your interface
interface Type {
void method();
}
Now you can have
SubType1 implements Type {
void method() {
// do something.
}
}
SubType2 implements Type {
void method() {
// do something.
}
}
Also you can use Abstract Skeletal pattern in which you can have class AbstractType with default implementation if required
Upvotes: 1
Reputation: 535
You could have an abstract base class "Chapter", from which ChapterI and ChapterII gets inherited.
Upvotes: 0
Reputation: 47287
make an abstract class, from which the both type of chapters inherit, and then declare a list of this type.
public abstract class AbstractChapter {}
public class ChapterTypeOne extends AbstractChapter {}
public classs ChapterTypeTwo extends AbstractChapter {}
List<AbstractChapter> chapters = new ArrayList<AbstractChapter>;
The operations that you are going to call should be declared in the abstract class, and then overriden as necessary in the specific implementations.
Upvotes: 2
Reputation: 400
The best way is to use inheritance to define an abstract class "Chapter", and derive the types of chapters from the abstract class.
Upvotes: 0