FrekoMedlem sedan okt. 2005158 inlägg
Tjenare!
har gjort en klass(vi kallar den Item()) och även en klass som är en specialisering av klassen Item() , vi kan kalla den DVD()
det enda som skiljer dem åt är endast en metod.
klassen skall väl skapas så här
public class DVD extends Item
{
public DVD(String description)
{
super(description);
}
private void specialmetoden()
{
// här händer det nåt kul som skiljer sig från Item klassen
}
}
sedan kanske jag skapar en DVD med raden
Item item = new DVD(description);
men när jag sedan kör programmet så blir det ändå den vanliga Item klassen som används?? varför ?
nitro2k01Medlem sedan aug. 20037 630 inlägg
Objektet är ett DVD-objekt, men måste castas om för att du ska kunna komma åt specialmetoden. Att du deklarerar variabeln item som klass Item gör att du kan lagra en referens till vilket objekt som helst som förlänger Item, men priset du får betala är att du bara kommer åt Item's egenskaper.
Ska du lagra något annat objekt, som kanske inte har DVD-klassens speciella egenskap är det ju dumt att om det går att skriva kod på det viset. Vet du att du bara ska använda DVD-klassen i det fallet är det bättre att deklarera variabeln som DVD.
Nedan följer ett korrekt exempel:
Item item = new DVD(description);
DVD dvdItem = (DVD)item; // Casta till DVD
if (dvdItem==null){
// Fel! item är inte av typen DVD, hantera felet!!
}else{
dvdItem.specialmetoden()
}
PhorpherMedlem sedan feb. 20002 059 inlägg
Freko skrev:
sedan kanske jag skapar en DVD med raden
Item item = new DVD(description);
men när jag sedan kör programmet så blir det ändå den vanliga Item klassen som används?? varför ?
Därför att Item enbart känner till dess egna metoder. Om du castar item till en DVD så kommer du komma åt de metoder som klassen DVD implementerar.
Det här kallas för slicing. Dvs. att enbart de attribut och metoder som tillhör basklassen är synliga så länge man hanterar objektet som av typen basklass (Item).
FrekoMedlem sedan okt. 2005158 inlägg
nu finns ju "specialmetoden" i både Basklassen Item() och förlängningsklassen DVD().
så det är ju en typ Override man vill ha.
men det kanske är det ni menar.
provar för fullt nu
PhorpherMedlem sedan feb. 20002 059 inlägg
Freko skrev:
nu finns ju "specialmetoden" i både Basklassen Item() och förlängningsklassen DVD().
så det är ju en typ Override man vill ha.
men det kanske är det ni menar.
provar för fullt nu
Ja. Eftersom du typar DVD till en Item så kommer Item's specialmetod att köras. Om du däremot castar den till en DVD så kommer DVD's specialmetod köras.
ViktorMedlem sedan aug. 20021 710 inlägg
nitro2k01 skrev:
Item item = new DVD(description);
DVD dvdItem = (DVD)item; // Casta till DVD
if (dvdItem==null){
// Fel! item är inte av typen DVD, hantera felet!!
}else{
dvdItem.specialmetoden()
}
Om det inte är ett objekt av typen DVD så kastas väll ett exception, ClassCastException, och då är det detta exception som behöver fångas och inte något som kan kontroleras med en if sats. Har inte lyckats få till ett exempel program att kompilera så jag kan inte testa men jag är ganska säker :)
/Viktor
suzizMedlem sedan maj 20053 inlägg
Vänta nu här...
Om man överskuggar (overrides) en metod från basklassen i subklassen så är det objektets typ och inte referensens typ som avgör vilken metod som anropas.
Item item = new DVD(description);
item.specialmetoden();
Ovanstående bör alltså anropa metoden specialmetoden() i DVD-klassen under förutsättning att specialmetoden inte skiljer något i parameterlistan från Item och DVD-klassen.
Följande kod ska alltså ge utskriften: Subklassens metod körs!
public class MainKlass
{
public static void main(String[] args)
{
Basklass obj = new Subklass();
obj.metod();
}
}
class Basklass
{
public void metod()
{
System.out.println("Basklassens metod körs!");
}
}
class Subklass extends Basklass
{
public void metod()
{
System.out.println("Subklassens metod körs!");
}
}
PhorpherMedlem sedan feb. 20002 059 inlägg
suziz skrev:
Vänta nu här...
Om man överskuggar (overrides) en metod från basklassen i subklassen så är det objektets typ och inte referensens typ som avgör vilken metod som anropas.
...
Helt korrekt. Mitt svar är felaktigt. :)
nitro2k01Medlem sedan aug. 20037 630 inlägg
Viktor skrev:
Om det inte är ett objekt av typen DVD så kastas väll ett exception, ClassCastException, och då är det detta exception som behöver fångas och inte något som kan kontroleras med en if sats. Har inte lyckats få till ett exempel program att kompilera så jag kan inte testa men jag är ganska säker :)
/Viktor
Du har helt rätt. Jag var säker på att en felaktig cast skulle ge null, inte kasta ClassCastException. Det kanske gäller om man castar interfaces. Jaja, det är ändå fel sätt att programmera. Kodexempel för övrigt:
public class ClassCastE{
public static void main(String[]e){
Mother x = new Child1();
Child2 y = (Child2)x; // Denna rad kastar en ClassCastException
}
}
class Mother{Mother(){;}}
class Child1 extends Mother{Child1(){;}}
class Child2 extends Mother{Child2(){;}}