Dědičnost, přetížení - Override /logické nepochopení – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dědičnost, přetížení - Override /logické nepochopení – .NET – Fórum – Programujte.comDědičnost, přetížení - Override /logické nepochopení – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Petrroll0
Stálý člen
26. 7. 2010   #1
-
0
-

Zdar. V 17 kapitole knihy Visual C# Krok za krokem 2008 jsem narazil na pro mě zajímavý kus kódu. Problém je že nechápu proč jsou v dané třídě dvě metody se stejnou signaturou, z nichž jedna je definována jako override metody nacházející se v třídé Object. Jde o to kdy je volána ta a kdy ta metoda.
Přijímají jiné parametry (jedna přijíma typ Jméno, druhá Objekt). Proč tedy není jednoduše přetížená? Proč je tam to ovveride? (Pochopil bych to kdyby volala základní implementaci "base" ale to nevolá)



namespace Indexery
{
struct Jméno
{
public Jméno(string text)
{
this.jméno = text;
}
public string Text
{
get { return this.jméno; }
}
public override int GetHashCode()
{
return this.jméno.GetHashCode();
}
public override bool Equals(object další)
{
return (další is Jméno) && Equals((Jméno)další);
}
public bool Equals(Jméno další)
{
return this.jméno == další.jméno;
}
private string jméno;
}
}

Předem díky všem co mi tu neustále osvětlují pro ně trivialní otázky.

Nahlásit jako SPAM
IP: 92.62.224.–
Reklama
Reklama
velurex0
Stálý člen
26. 7. 2010   #2
-
0
-

V tomto případě to myslím moc nesouvisí s dědičností, ale jde o to, že když přetěžuješ GetHashCode kompilátor si vynutí abys přetížil také Equals. Doufám že moc nekecám. :)

Nahlásit jako SPAM
IP: 213.191.119.–
velurex0
Stálý člen
26. 7. 2010   #3
-
0
-

"Přetížil" byl špatně zvolený termín, lepší je "předefinováváš". Snad jsem tě neuvedl v ještě větší zmatek. :)

Nahlásit jako SPAM
IP: 213.191.119.–
Petrroll0
Stálý člen
26. 7. 2010   #4
-
0
-

To je mi jasný jde mi výslovně o tuhle část -

public override bool Equals(object další)

{
return (další is Jméno) && Equals((Jméno)další);
}
public bool Equals(Jméno další)
{
return this.jméno == další.jméno;
}

O dědičnost pravda moc nejde, ale nenapadlo mě jak to pojmenovat.
Zde jde o to že je metoda předefinována 2x jednou s override, jednou bez. Proč? Co to vlastně dělá?
Mám teorii, zvenku se zavolá override/nutá metoda, ale ta když volá znovu Equals (sama sebe) tak už se volá tu ne-override. Ale nechápu proč jak?

Nahlásit jako SPAM
IP: 92.62.224.–
liborb
~ Redaktor
+18
Guru
26. 7. 2010   #5
-
0
-

Equals s parametrem object je přece virtuální metoda třídy Object, tak proto override.

Ta druhá "jen" přetěžuje Equals.

Nahlásit jako SPAM
IP: 85.207.166.–
Petrroll
~ Anonymní uživatel
151 příspěvků
26. 7. 2010   #6
-
0
-

Pravda, uz chapu.

Nahlásit jako SPAM
IP: 92.62.224.–
Petrroll0
Stálý člen
26. 7. 2010   #7
-
0
-

Jenom doplnění. Nebylo by správnější aby obě metody měly override? V podstatě by byla dvakrát předefinována, - přetížena.
//EDIT: Teď my došlo že je to logická blbost.

Nahlásit jako SPAM
IP: 92.62.224.–
liborb
~ Redaktor
+18
Guru
26. 7. 2010   #8
-
0
-

Možná se ti plete override a overload. První by se dalo přeložit jako překrýtí, ale to není úplně správně. Lepší je, jak napsal velurex, předefinování. Prostě jde o klasiku polymorfismu. To druhé má správný překlad přetížení - víc stejně pojmenovaných funkcí, které se liší počtem a/nebo typem parametrů.

Nahlásit jako SPAM
IP: 91.203.96.–
Petrroll0
Stálý člen
26. 7. 2010   #9
-
0
-

Ne, špatně jsem to napsal, myslel jsem co by se stalo kdybych obě napsal jako override, tudíž by obě překrývaly základní implementaci a zároveň přetěžovali sami sebe.

Nahlásit jako SPAM
IP: 92.62.224.–
velurex0
Stálý člen
27. 7. 2010   #10
-
0
-

To ti kompilátor nedovolí. Předefinovat (tedy zapsat s override) můžeš jen tu, která již existuje v předkovi (včetně shodné signatury) a tam je zapsaná s klíčovým slovem virtual případně abstract.

Nahlásit jako SPAM
IP: 213.191.119.–
Petrroll0
Stálý člen
27. 7. 2010   #11
-
0
-

Jo, to teď po vyzkoušení vím také, jenom jsem vysvětloval jak jsem myslel příspěvek nahoře.
Každopádně dík.

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Podobná vlákna

Logické výrazy — založil xeonikx

C++ nepochopeni fce — založil Franceq

Parser pro logické výrazy — založil durmitor

Přetížení — založil Marik

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý