View Full Version : Instansiering av subklasser till abstrakt superklass
Navegador
2001-05-05, 18:26
Hej!
Om man vill att en abstrakt superklass ska implementera ett interface, ex
public abstract class Shape Implements Comparable
Varför gör det att subklasserna inte kan instansieras:
new Circle( radie );
Kompilator-error: class circle is abstract and can't be instanciated. Det funkade förut när class Shape inte implementerade Comparable. Vill göra så för att kunna använda en generisk (mer generell) sorteringsalgoritm som tar objekt av typen Comparable.
------------------
Anfäkta och anamma
Navegador
Öhh... du måste definiera metoder i Shape eller någon av dess subklasser som motsvarar Comparable's metoder... dvs compare och equals, har jag väl för mig att det var.
------------------
These are the cries of the carrots, the cries of the carrots! You see, Reverend Maynard, tomorrow is harvest day and to them it is the holocaust.
Navegador
2001-05-06, 15:54
Har gjorts. :=)
------------------
Anfäkta och anamma
Navegador
... och det är fortfarande fel, eller? Har du implementerat alla metoder i från Shape, då?
------------------
These are the cries of the carrots, the cries of the carrots! You see, Reverend Maynard, tomorrow is harvest day and to them it is the holocaust.
Navegador
2001-05-07, 01:01
Ja. Anledningen till att superclass Shape är abstrakt är att den har en metod som är det, nämligen area.
------------------
Anfäkta och anamma
Navegador
Och det funkar fortfarande inte? Klagar kompilatorn enbart över att Circle är abstrakt?
------------------
These are the cries of the carrots, the cries of the carrots! You see, Reverend Maynard, tomorrow is harvest day and to them it is the holocaust.
Vetgirig
2001-05-07, 14:36
Kolla att signaturerna för alla metoder är korrekta. Har du olika signaturer så är det olika metoder. Dvs Circle blir abstrakt om kompilatorn inte finner en metod compare som har rätt argument.
------------------
Anders Lindbäck,Igiro Internet Giro (http://www.igiro.se/)
Navegador
2001-05-13, 02:59
Kanske. Först och främst har jag en egen klass Comparable, med boolean lessThan (Comparable rhs). Comparable importeras rätt, dvs inte den inbyggda i Java.
Som jag fattar interface är det ett slags multipelt arv som ju inte är tillåtet i Java. Jag vill att mina objekt - jag struntar i super och subklasser nu utan har bara en klass Circle - ska implements Comparable. Sagt och gjort. Jag har implementerat metoden lessThan:
// från interfacet
final public boolean lessThan( Comparable rhs )
{
return area( ) < (double) rhs.area( );
}
Förut var det en sorteringsalgoritm i main-klassen som var för double och inget annat. Nu ska jag sortera objekt av typen Comparable. Då såg metoden lessThan ut så här:
final public boolean lessThan( Circle rhs )
{
return area( ) < rhs.area( ); // parameter-objektet jämförs med föreliggande objekt
}
Antagligen fel att göra en "type cast"? Jag testade först med (Circle) ovan. Den borde anropa Circle-objektet som rhs är wrapper för. Resultat:
/../Shape/Circle.java:21: Incompatible type for <. Can't convert Circle to double.
return area( ) < (Circle) rhs.area( );
...
2 errors
Med (double):
/../Circle.java
/HD 7.9 GB/Tobias/programmering/Java/tentan/eget/Shape/Circle.java:21: Method area() not found in interface Supporting.Comparable.
return area( ) < (double) rhs.area( );
^
1 error
Done
------------------
Anfäkta och anamma
Navegador
sgtpepper
2001-05-13, 11:26
Testa att skriva
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:[/kod]<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
return area( ) < ((Circle)rhs).area();
[/kod]
istället, någon skillnad?
------------------
skaparen av allt som är mjukt och luktar lavendel
[Redigerat av sgtpepper den 13 maj 2001]
Navegador
2001-05-13, 16:49
Tack. Kom förresten på det själv igår natt! Nu kan jag sortera vad som helst. Tex kvadrater som är subklass till rektanglar som är subklass till Shape (Shape implements Comparable). Type-casten blir:
(Shape(rhs))
Det som görs, är väl att Comparable är wrapper-klass som innehåller Shape-objekt som i sin tur är rektanglar, cirklar mm? Dynamisk bindning väl? Dvs vid run-time?
Vad jag undrar dock, är hur det funkar med det faktum att jag skickar med Comparable i metodsignaturen (i Shape). Comparable är ju ett interface. Vad händer egentligen?
------------------
Anfäkta och anamma
Navegador
[Redigerat av Navegador den 13 maj 2001]
sgtpepper
2001-05-13, 20:30
Nu har jag inte sett hela din kod eftersom Comparable är ett interface som implementeras av Shape så innebär det att Comparable definerar en uppsättning metoder som måste implementeras av Shape, på så sätt så är man alltid säker på att dessa metoder existerar i klasser som implementerat Comparable.
Comparable i ditt fall innehåller metoder för att göra jämförelser, alla klasser som implementerat detta har alltså dessa metoder vilket innebär att dom är "comparable" dvs jämförelsebara.
När skickar med ett Comparable-objekt i metodsignaturen så innebär det att vilken klass som helst som implementerat Comparable kan skickas med till metoden. Metoden behöver inte veta vilken typ av klass det är eftersom det är säkerställt att alla metoder som definerats i Comparable finns tillgängliga i det medskickade objektet.
------------------
skaparen av allt som är mjukt och luktar lavendel
vBulletin® v3.8.6, Copyright ©2000-2013, Jelsoft Enterprises Ltd.