Anmäl dig till Roborock Challenge!

@override och super i Java respektive C#

Permalänk
Medlem

@override och super i Java respektive C#

Hej! Denna metod som ärver ifrån superklassen i Java fungerar bra.

public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ålder: " + getAge()); }

Här använder jag @Override men det behövs väl egentligen inte?

@Override public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ålder: " + getAge()); }

Till skillnad mot C# där man väl måste använda virtual och override?

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Hej! Denna metod som ärver ifrån superklassen i Java fungerar bra.

public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ålder: " + getAge()); }

Här använder jag @Override men det behövs väl egentligen inte?

@Override public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ålder: " + getAge()); }

Till skillnad mot C# där man väl måste använda virtual och override?

I Java måste alla ärvda metoder annoteras med @Override. I detta fall är det dock helt onödigt att ö.h.t. implementera printBooks i underklassen eftersom implementationerna är identiska. Du kan fortfarande anropa metoden på en instans av underklassen.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Fast det stämmer väl inte. Dessa metoder var både från en subklass för att visa att det går utan.

Här är metoden i superklassen

public void printBooks() { System.out.println("\n"); System.out.println("Titel " + title); System.out.println("Författare " + author); System.out.println("Pris " + price); }

Här är subklassens metod som implementerar superklassens metod genom super nyckelordet. @Override behövs inte. Det fungerar i alla fall utan @Override. Man kanske måste ändå men av vilket skäl?

public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ämne: " + getSubject()); }

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Fast det stämmer väl inte. Dessa metoder var både från en subklass för att visa att det går utan.

Här är metoden i superklassen

public void printBooks() { System.out.println("\n"); System.out.println("Titel " + title); System.out.println("Författare " + author); System.out.println("Pris " + price); }

Här är subklassens metod som implementerar superklassens metod genom super nyckelordet. @Override behövs inte. Det fungerar i alla fall utan @Override. Man kanske måste ändå men av vilket skäl?

public void printBooks() { super.printBooks(); //Superklassens metod System.out.print("Ämne: " + getSubject()); }

Okej, det är sant att det inte är nödvändigt men det är så pass allmänt vedertaget att det blir det i praktiken.

Om du använder @Override så kommer kompilatorn att generera felmeddelanden om t.ex. metoden saknas i superklassen, eller om signaturen är felaktig. Ett annat plus är att det signalerar för andra som läser din kod vad dess intention är. Kodens läsbarhet ska inte underskattas.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem
Skrivet av noMad17:

Okej, det är sant att det inte är nödvändigt men det är så pass allmänt vedertaget att det blir det i praktiken.

Om du använder @Override så kommer kompilatorn att generera felmeddelanden om t.ex. metoden saknas i superklassen, eller om signaturen är felaktig. Ett annat plus är att det signalerar för andra som läser din kod vad dess intention är. Kodens läsbarhet ska inte underskattas.

Aha, ok, tack!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Om du undrar varför det är ett krav i C# men inte i Java så har det nog mest att göra med att Java är ett äldre språk som inte hade override från början, och när @Override lades till i Java 1.5 så gick det inte att göra det till ett krav eftersom det skulle ha sönder i stort sett all existerande kod.

C++ har precis samma problem där override lades till senare och inte heller krävs för att överlagra en metod, men C# som är nyare än både C++ och Java har vad jag vet haft override redan från början och kunde därför göra det till ett krav.