C# - rozhrani a vlastnosti – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# - rozhrani a vlastnosti – .NET – Fórum – Programujte.comC# - rozhrani a vlastnosti – .NET – Fórum – Programujte.com

 

jirkab0
Newbie
11. 3. 2012   #1
-
0
-

Zdravim, Mam jednu otazku ohledne rozhrani mam nasledujici kod

 interface IAuto
    {
        Location Poloha{ get; set; }
    }

    abstract class Auto : IAuto
    {
        public Location Poloha
        {
            get { return poloha; }
            protected set { poloha = value; }
        }
    }

Jde mi o to ze mi prekladac vyhodi chybu u te vlastnosti ze set neni public, ale ja potrebuji aby se ta vlastnost dala nastavovat jen ve zdedenych tridach tudiz musi byt protected. Nevite jak na to?

Diky

Nahlásit jako SPAM
IP: 109.80.144.–
Evzen+2
Návštěvník
11. 3. 2012   #2
-
0
-

Abstraktni tridu mas ok, takhle se ti bude nastavovat property pouze v potomcich a ne z venci.

Co mas ale spatne je pak rozhrani. Staci definovat, ze location je pouze getter. Privatni nebo protected metody samotny interface nezajima.

    interface IAuto
    {
        Location Poloha { get; }
    }

    // zbytek muzes ponechat
Nahlásit jako SPAM
IP: 109.80.214.–
jirkab0
Newbie
11. 3. 2012   #3
-
0
-

#2 Evzen
Aha diky, takze kdyz ma property setter public tak ho do interfacu napisu a kdyz je private nebo protected tak ne jo?

Nahlásit jako SPAM
IP: 109.80.144.–
zlz
~ Anonymní uživatel
634 příspěvků
11. 3. 2012   #4
-
0
-

#3 jirkab
Interface definuje rozhraní a ta třída ho pak implementuje.

Takže žádné "kdyz ma property setter public tak ho do interfacu napisu", ale naopak "když interface definuje setter, tak ho implementuju".

Nahlásit jako SPAM
IP: 213.211.51.–
Evzen+2
Návštěvník
12. 3. 2012   #5
-
+2
-
Zajímavé

#3 jirkab

Ahoj Jirko, zcela chápu jak to myslíš. Vsadím se, že si začal programovat nějaký klasický příklad na OOP a chtěl sis ho vyzkoušet. Teď si možná říkáš: "sakra k čemu tam vlastně to rozhraní je?".

Když jsem já začínal, byl jsem na tom stejně. 

Tak tedy od začátku:

K čemu je rozhraní (interface)?

Rozhraní jako takový bylo zavedeno proto, abychom se vyvarovali problematice s mnohonásobnou dědičností. 

Pěkná věta, ale její důsledek není asi na první pohled viditelný. Teď mi napadá, to samé si asi řekneš o "E = mc^2". Kdo by si kdy představil, že dnešní jaderná energie stojí na takto pěkném vzorečku :)

Problém s vícenásobnou dědičností je ten, že pokud oba předci obsahují stejnou proměnnou, tak kterou si vybrat?

// ber to jako pseudokod, samozrejme, c# nema mnohonasobnou dedicnost, ale napr. c++ ano 

public class Matka {
  public string oci;
  public string usi;
}

public class Otec {
  public string nos;
  public string oci;
}

public class Dite : Otec, Matka {
  // ci pak oci dite dostane?
}

Samozřejmě tento problém lze řešit různě a plno jazyků se s ním potýká (C++, python a kdoví co ještě). Ale pak přišli chytří pánové, dali hlavy dohromady a řekli si, co když pouze předepíšeme, že daná třída musí obsahovat danou vlastnost (metodu, udalost..) a o implementaci se již starat nebudeme.

Takže zpět k tvýmu dotazu, jestli když je property non-public, tak ji do inteface nepíšu

Svým způsobem ty ani interface používat nemusíš, můžeš používat přímo objekty/třídy. Rozhraní má tu výhodu, že pokud chceš různé objekty používat stejným způsobem, tak si nadefinuješ rozhraní, do kterého předepíšeš metodu, kterou ty potřebuješ zvenčí používat a všech objektech si danou metodu doimplementuješ dle tvojí potřeby.

Automaticky to tedy neznamená, že do interface musíš přepisovat všechny public metody či property. Pouze ty, které pro daný interface jsou pro tebe důležitý a který musí všechny objekty typu IAuto mít. Navíc těch rozhraní můžeš mít víc ;)

Abstraktní třída pak slouží tobě k tomu, abys nemusel pořád psát stejný kód ve všech třídách dokola, zejména je to dobré, pokud tuto vlastnost (metodu) potřebuješ zpětně upravit. Stačí ti jedna změna v jednom souboru.

Nahlásit jako SPAM
IP: 193.179.183.–
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, 40 hostů

Podobná vlákna

Rozhraní — založil Balaam

Rozhrani — založil alp

Uložení vlastností — založil Jiří Zdvomka

Vlastnosti okna — založil Jiří Hlaváček

Vlastnosti souborů — založil ench

 

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