Mam spravit ulohu v jave a potrebujem si vybrat medzi 1.zoznam ako linearny zretazeny zoznam s referenciami na obsah alebo 2.front ako binárny súbor za podmienok spracovavane prvky budu heterogenne, vyuzitie objektovo orientovaneho programovania a pristup k heterogennym prvkom pomocou polymorfizmu co z toho je jednoduchsie spravit?
Fórum › Java
Otazka
#2 ingiraxo
Vedel by si mi povedat ako to spravit polymorfne ked vyuzijem triedu Object tak to bude polymorfne?
public class Node {
private Object item;
private Node next;
public Node(Object newItem) {
item = newItem;
next = null;
}
public Node(Object newItem, Node nextNode) {
item = newItem;
next = nextNode;
}
public void setItem(Object newItem) {
item = newItem;
}
public Object getItem() {
return item;
}
public void setNext(Node nextNode) {
next = nextNode;
}
public Node getNext() {
return next;
}
}
?
#3 emdzej
nebude, musel by si použít nějaký rozhraní místo objektu.. např.
interface IObject {
int getValue();
}
class Node {
private IObject object;
private Node next;
// další...
}
Všechny třídy, který budou implementovat IObject bude možné používat v lineární seznamu a všechny objekty můžeš přetypovat na IObject a volat metodu getValue() s jinou implementací -> polymorf
#3 emdzej
Takto třeba může vypadat jednoduchá funkční ukázka
interface IMessage
{
String getMessage();
}
abstract class AbstractMessage implements IMessage
{
private final String message;
public AbstractMessage(String message)
{
this.message = message;
}
@Override
public String getMessage()
{
return message;
}
}
final class InfoMessage extends AbstractMessage
{
public InfoMessage()
{
super("Info Message");
}
}
final class ErrorMessage extends AbstractMessage
{
public ErrorMessage()
{
super("Error Message");
}
}
final class Node
{
private IMessage item;
private Node next;
public IMessage getItem()
{
return item;
}
public void setItem(IMessage item)
{
this.item = item;
}
public Node getNext()
{
return next;
}
public void setNext(Node next)
{
this.next = next;
}
}
public class LinkedList implements Iterable<IMessage>
{
private Node first;
private Node current;
public void add(IMessage msg)
{
Node node = new Node();
node.setItem(msg);
if (first == null) {
first = node;
} else {
current.setNext(node);
}
current = node;
}
@Override
public Iterator<IMessage> iterator()
{
return new Iterator<IMessage>()
{
private Node node;
private boolean begin = true;
@Override
public IMessage next()
{
Node n = node;
node = node.getNext();
return n.getItem();
}
@Override
public boolean hasNext()
{
if (begin) {
node = first;
begin = false;
}
return (node != null);
}
};
}
public static void main(String[] args)
{
LinkedList ll = new LinkedList();
ll.add(new InfoMessage());
ll.add(new ErrorMessage());
Iterator<IMessage> it = ll.iterator();
while (it.hasNext()) {
System.out.println(it.next().getMessage());
}
}
}
#7 emdzej
rozhodně ne... teoreticky při Comparable ano, ale je to nesmysl takto použít.. viz níže
pokud by si použil Serializable, tak tam sice budeš moct vložit všechny objekty, který impl. toihle rozhraní, ale nebudou mít žádné spoledné metody! Takže je to stejné, jako kdyby si použil Object
pokud použiješ Comparable, tak je to podobný, sice tam je nějaká metoda na porovnání, ale to je celý.. takový použití nedává smysl.. pokud potřebuješ, aby tam byli pouze objekty, který jdou porovnávat, tak vytvoř vlastní rozhraní, který rozšíříš o Comparable
čeho chceš vlastně dosáhnout?
#9 emdzej
koukal ses vůbec na tu ukázku co jsem posílal? Tam je přesně to, co potřebuješ včetně těch 2 typů. (abstraktní třída není nutná, jen je to lepší)
zjednodušená verze může být třeba tak, že rozhraní bude mít metodu na vypsání nějakého textu do konzole... potom vytvoříš 2 třídy, který naimplementujou rozhraní a ty třídy potom vložíš do listu
interface IObject {
void print();
}
class ClassA implements IObject {
@Override public void print() {
System.out.println(getClass().getSimpleName());
}
}
class ClassB implements IObject {
@Override public void print() {
System.out.println(getClass().getSimpleName());
}
}
nebo (stejný a lepší kód než výše)
interface IObject {
void print();
}
abstract class AbstractObject implements IObject {
@Override public void print() {
System.out.println(getClass().getSimpleName());
}
}
class ClassA extends AbstractObject {}
class ClassB extends AbstractObject {}
A implementovat rozhraní budou takový třídy, který budeš chtít vložit do listu... můžeš samozřejmě udělat složitější konstrukci a přidat generiku, potom budeš moct vložit do listu třeba int a string zabalený ve vlastním objektu
#12 emdzej
se složitostí to nemá nic společnýho, samozřejmě tam iterátor být nemusí, mám ho tam jen proto, aby se dalo se seznamem líp pracovat.. hlavně aby si nepracoval s nodem jako takovým, ale s tím rozhraním
#14 emdzej
u linked listu je problém, že nepodporuje indexování, takže když chceš insertnout prvek mezi dva nody, tak musíš ručně projit (vždy procházíš od začátku) až k tomu nodu a tam přidat novej nod... nejhorší je vkládat předposlední node, tam musí logika projít všechny prvky
samozřejmě jsou způsoby i prostor pro optimalizaci, např. že node bude držet pozici i rodičovského nodu, to ti potom umožní procházet nody i od konce, ale pokud to k něčemu nepotřebuješ, tak to nedělej
vždy si musíš držet první nod a je dobrý držet i poslední, což mám taky v ukázce
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Programovanie c++ otázka — založil toso992
Moderátoři diskuze