Top Banner
Objektumorientált programozás C# nyelven 1. rész Osztályok és objektumok Mezık és metódusok Konstruktor és destruktor Névterek és hatókörök Láthatósági szintek Osztály szintő tagok Beágyazott osztályok Felbontott típusok Készítette: Miklós Árpád Dr. Kotsis Domokos
52

Objektumorientált programozás C# nyelvenObjektumorientált programozás C# nyelven 1. rész Osztályok és objektumok Mezık és metódusok Konstruktor és destruktor Névterek és

Oct 24, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • Objektumorientált programozás C# nyelven

    1. rész

    Osztályok és objektumokMezık és metódusok

    Konstruktor és destruktorNévterek és hatókörökLáthatósági szintekOsztály szintő tagokBeágyazott osztályokFelbontott típusok

    Készítette:Miklós ÁrpádDr. Kotsis Domokos

  • A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelezı irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges.

    Hallgatói tájékoztató

  • Osztályok és objektumok• Osztály: belsı adatok és a rajtuk mőveleteket végzı

    algoritmusok által alkotott egységes struktúra• Objektum: valamely osztály egy tényleges példánya

    – Az objektumok (bizonyos esetekben maguk az osztályok is) a program futása során egymással kommunikálnak

    • Osztály tartalma (az osztály „tagjai”):– Mezık („field”)

    • Normál és csak olvasható változók, konstansok („constant”)

    – Metódusok („method”)• Normál metódusok, konstruktorok („constructor”), destruktorok („destructor”)

    – Tulajdonságok* („property”) és indexelık* („indexer”)– Események* („event”)– Operátorok* („operator”)– Beágyazott típusok („nested type”)

    • Osztályok („class”), struktúrák* („struct”), interfészek* („interface”), képviselık* („delegate”)

  • Osztályok és objektumok• Az osztályok deklarálása a classclassclassclass kulcsszó segítségével

    történik– Az osztályok deklarációja egyben tartalmazza az összes tag leírását és

    a metódusok megvalósítását • Az osztályoknál tehát nincs külön deklaráció (létrehozás) és definíció (kifejtés)

    • Osztályok és objektumok tagjainak elérése: „ . ”operátor– Példány szintő tagoknál a példány nevét, osztály szintő tagoknál

    (ezeket lásd késıbb) az osztály nevét kell az operátor elé írnunk• Az osztály saját tagjainak elérésekor (tehát az osztály saját metódusainak

    belsejében) nem kötelezı kiírni a példány, illetve az osztály nevét

    classclassclassclass PPPPééééldaosztldaosztldaosztldaosztáááálylylyly{{{{

    // Itt kell deklar// Itt kell deklar// Itt kell deklar// Itt kell deklaráááálnunk az osztlnunk az osztlnunk az osztlnunk az osztáááály ly ly ly öööösszes tagjsszes tagjsszes tagjsszes tagjáááát (mezt (mezt (mezt (mezııııket, metket, metket, metket, metóóóódusokatdusokatdusokatdusokat………… ))))// A met// A met// A met// A metóóóódusok konkrdusok konkrdusok konkrdusok konkréééét megvalt megvalt megvalt megvalóóóóssssííííttttáááássssáááát szintt szintt szintt szintéééén itt kell megadnunkn itt kell megadnunkn itt kell megadnunkn itt kell megadnunk

    }}}}

  • Mezők• Minden változó tagja egy osztálynak (tagváltozó)

    – Ezeket az adatelemeket nevezzük mezıknek

    • A mezık értéke helyben is megadható (inicializálás)

    • A mezık lehetnek– Olvasható/írható mezık

    • Értékük tetszés szerint olvasható és módosítható

    – Csak olvasható mezık• Értékük kizárólag inicializálással vagy konstruktorból állítható be

    – Konstans mezık• Értéküket a fordítóprogram elıre letárolja, futási idıben sosem módosíthatók

    stringstringstringstring jegy = jegy = jegy = jegy = "jeles""jeles""jeles""jeles";;;;int int int int j = j = j = j = ----10101010;;;;

    readonlyreadonlyreadonlyreadonly stringstringstringstring SosemVSosemVSosemVSosemVááááltozomMegltozomMegltozomMegltozomMeg = = = = "I "I "I "I WillWillWillWill StayStayStayStay The The The The SameSameSameSame"""";;;;

    constconstconstconst doubledoubledoubledouble ππππ = 3.14159265;= 3.14159265;= 3.14159265;= 3.14159265;constconstconstconst intintintint öööösszeg = 23 * (45 + 67);sszeg = 23 * (45 + 67);sszeg = 23 * (45 + 67);sszeg = 23 * (45 + 67);

  • Metódusok• Minden metódus tagja egy osztálynak (tagfüggvény)• A metódusok rendelkezhetnek

    – Megadott vagy változó darabszámú paraméterrel (params kulcsszó)

    – Visszatérési értékkel• Nem kötelezı, ha nincs, ezt a void kulcsszóval kell jelölni

    • A paraméterek és a visszatérési érték határozzák meg azt a protokollt, amelyet a metódus használatához be kell tartani– Szokás ezt a metódus „aláírásának” vagy „szignatúrájának” is nevezni

    voidvoidvoidvoid EgyparamEgyparamEgyparamEgyparamééééteresMetteresMetteresMetteresMetóóóódusdusdusdus((((boolboolboolbool feltfeltfeltfeltéééétel)tel)tel)tel)voidvoidvoidvoid TTTTööööbbparambbparambbparambbparamééééteresMetteresMetteresMetteresMetóóóódusdusdusdus((((int int int int a, a, a, a, floatfloatfloatfloat b, b, b, b, stringstringstringstring c)c)c)c)voidvoidvoidvoid MindenbMindenbMindenbMindenbıııılSokatElfogadlSokatElfogadlSokatElfogadlSokatElfogadóóóóMetMetMetMetóóóódusdusdusdus((((paramsparamsparamsparams objectobjectobjectobject[] [] [] [] paramparamparamparamééééterTterTterTterTöööömbmbmbmb))))

    voidvoidvoidvoid NincsVisszatNincsVisszatNincsVisszatNincsVisszatéééérrrréééésisisisiÉÉÉÉrtrtrtrtéééékemkemkemkem()()()()intintintint EgEgEgEgéééészSzszSzszSzszSzáááámotAdokVisszamotAdokVisszamotAdokVisszamotAdokVissza((((floatfloatfloatfloat paramparamparamparamééééter)ter)ter)ter)stringstringstringstring VVVVáááálaszomEgyKaraktersorozatlaszomEgyKaraktersorozatlaszomEgyKaraktersorozatlaszomEgyKaraktersorozat((((stringstringstringstring bemenbemenbemenbemenııııAdatAdatAdatAdat))))SajSajSajSajáááátTtTtTtTíííípuspuspuspus ÁÁÁÁtalaktalaktalaktalakííííttttóóóó((((SajSajSajSajáááátTtTtTtTíííípuspuspuspus forrforrforrforráááásObjektumsObjektumsObjektumsObjektum, , , , intintintint egyikMezegyikMezegyikMezegyikMezııııÚÚÚÚjjjjÉÉÉÉrtrtrtrtéééékekekeke, , , , stringstringstringstring mmmmáááásikMezsikMezsikMezsikMezııııÚÚÚÚjjjjÉÉÉÉrtrtrtrtéééékekekeke))))

  • Függvények

    Séma:

    típus függvénynév(paraméterek){függvénytörzs}

  • Függvények típusa

    1. A típus a viszaadott érték típusa, vagy void.

    2. A típust megelızheti a.) a láthatóság megadása (private,

    protected, public, stb.), b.) osztály szintő tagnál a static szó.

  • Függvények paramétereiA paramétereknél megadandó a típus és az a név, amelyen a függvénytörzsben a paraméterre hivatkozunk.Referencia típusú paramétereknél a paraméter mind bemenı, mind visszatérıértéket tartalmazhat.Érték típusú paraméterek alapesetben csak „bemenı” paraméterek lehetnek, azaz csak értéket adhatnak a függvény számára.Érték típusú paramétert „kimenı”-vé az out,„ki- és bemenı”-vé a ref módosító tehet.

  • Függvénytörzs

    A végrehajtandó utasítások, melyek használhatják a bemenı paramétereket. A függvény visszatérı értéke a returnalapszót követi (ebbıl több is lehet a program különbözı ágain).Visszatérési érték nélküli (void) függvénynél – ha a program mindig a függvénytörzs fizikai végénél fejezıdik be – a return utasítás nem kötelezı.

  • Példa ref-reclass Ref{

    public void kiír(ref int a){a=a+5;

    }}

    class Reftpld{static void Main(){int x=3;Ref próba=new Ref();próba.kiír(ref x);System.Console.WriteLine(x);System.Console.ReadLine();

    }}

    VáltoztathatóparaméterPéldány

    létrehozás

  • Példa out-raclass Out {

    public void kiír(int a, out int b){b=a;

    }}

    class Outpld{static void Main(){int x=3;int y=4;Out próba=new Out();próba.kiír(x,out y);System.Console.WriteLine(x+" "+y);System.Console.ReadLine();

    }}

    KimenıparaméterPéldány

    létrehozás

  • Példa a Main() fv. paraméterére

    class Bepar{

    static void Main(string[] args){

    int i;for (i=0;i0)System.Console.WriteLine(args[i]);System.Console.ReadLine();

    }}

    Paraméter

    Stringekszáma

    Paraméterstringek

  • Speciális metódusok – a konstruktor• Minden osztálynak rendelkeznie kell konstruktorral

    – A konstruktor gondoskodik az osztály példányainak létrehozásáról• Szokás „példánykonstruktornak” is nevezni

    – A konstruktorok neve mindig megegyezik az osztály nevével– Több konstruktort is létrehozhatunk más-más paraméterlistával

    • Egy konstruktor a this kulcsszó segítségével meghívhat egy másik konstruktort is

    – Ha mi magunk nem deklarálunk konstruktort, a C# fordító auto-matikusan létrehoz egy paraméter nélküli alapértelmezett konstruktort

    • Új objektum a newnewnewnew operátor segítségével hozható létre– A new operátor gondoskodik a megfelelı konstruktor hívásáról

    • Az osztályok konstruktorait kívülrıl nem kell és nem is lehet más módon meghívni

    System.System.System.System.ObjectObjectObjectObject IgaziIgaziIgaziIgaziİİİİsksksksköööövvvvüüüületletletlet = = = = newnewnewnew System.System.System.System.ObjectObjectObjectObject();();();();

    SajSajSajSajáááátTtTtTtTíííípuspuspuspus ppppééééldldldldáááány = ny = ny = ny = newnewnewnew SajSajSajSajáááátTtTtTtTíííípuspuspuspus(25);(25);(25);(25);

    Paraméter nélküli konstruktor hívása

    Egy „int” típusú paraméterrel rendelkezı konstruktor hívása

  • Speciális metódusok – a destruktor• Az osztályoknak nem kötelezı destruktorral

    rendelkezniük– A destruktor neve egy „ ~ ” karakterbıl és az osztály nevébıl áll

    • Az objektumok megszüntetése automatikus– Akkor szőnik meg egy objektum, amikor már biztosan nincs rá szükség

    • Az objektumok megszüntetésének idıpontja nem determinisztikus (nem kiszámítható)

    – A futtatókörnyezet gondoskodik a megfelelı destruktor hívásáról• Nem kell (és nem is lehet) közvetlenül meghívni az osztályok destruktorait• A destruktor nem tudhatja, pontosan mikor hívódik meg

    – Destruktorra ritkán van szükségclassclassclassclass SajSajSajSajáááátTtTtTtTíííípuspuspuspus{{{{

    // // // // DestruktorDestruktorDestruktorDestruktor~~~~SajSajSajSajáááátTtTtTtTíííípuspuspuspus()()()(){{{{}}}}

    }}}}

  • 1. példaclassclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    privateprivateprivateprivate readonlyreadonlyreadonlyreadonly stringstringstringstring rrrréééészvszvszvszvéééénynnynnynnynéééév;v;v;v;privateprivateprivateprivate doubledoubledoubledouble rrrréééészvszvszvszvéééénynynynyáááárfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;publicpublicpublicpublic intintintint DarabszDarabszDarabszDarabszáááám;m;m;m;

    publicpublicpublicpublic RRRRéééészvszvszvszvéééénynynyny((((stringstringstringstring nnnnéééév, v, v, v, doubledoubledoubledouble áááárfolyam, rfolyam, rfolyam, rfolyam, intintintint darabszdarabszdarabszdarabszáááámmmm)))){{{{ // Konstruktor (neve megegyezik az oszt// Konstruktor (neve megegyezik az oszt// Konstruktor (neve megegyezik az oszt// Konstruktor (neve megegyezik az osztáááály nevly nevly nevly nevéééével) vel) vel) vel) ---- bebebebeáááállllllllíííítja az adatmeztja az adatmeztja az adatmeztja az adatmezıııık kezdeti k kezdeti k kezdeti k kezdeti éééértrtrtrtéééékkkkéééétttt}}}}publicpublicpublicpublic voidvoidvoidvoid VVVVéééétel(tel(tel(tel(intintintint mennyismennyismennyismennyiséééég)g)g)g){{{{ // A param// A param// A param// A paramééééterben megadott mennyisterben megadott mennyisterben megadott mennyisterben megadott mennyisééééggggőőőő rrrréééészvszvszvszvéééény vny vny vny váááássssáááárlrlrlrláááásasasasa}}}}publicpublicpublicpublic voidvoidvoidvoid EladEladEladEladáááás(s(s(s(intintintint mennyismennyismennyismennyiséééég)g)g)g){{{{ // A param// A param// A param// A paramééééterben megadott mennyisterben megadott mennyisterben megadott mennyisterben megadott mennyisééééggggőőőő rrrréééészvszvszvszvéééény eladny eladny eladny eladáááásasasasa}}}}publicpublicpublicpublic voidvoidvoidvoid ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss((((doubledoubledoubledouble áááárfolyam)rfolyam)rfolyam)rfolyam){{{{ // Az aktu// Az aktu// Az aktu// Az aktuáááális lis lis lis áááárfolyam berfolyam berfolyam berfolyam beáááállllllllííííttttáááása a paramsa a paramsa a paramsa a paramééééterben megadott terben megadott terben megadott terben megadott áááárfolyam alapjrfolyam alapjrfolyam alapjrfolyam alapjáááánnnn}}}}publicpublicpublicpublic doubledoubledoubledouble ÉÉÉÉrtrtrtrtéééék()k()k()k(){{{{ // R// R// R// Réééészvszvszvszvéééény ny ny ny öööösszsszsszsszéééértrtrtrtéééékkkkéééének kisznek kisznek kisznek kiszáááámmmmííííttttáááásasasasa}}}}

    }}}} részvénykezelı.cs

  • 1. példa (folytatás)classclassclassclass RRRRéééészvszvszvszvéééénykezelnykezelnykezelnykezelıııı{{{{

    static voidstatic voidstatic voidstatic void Main()Main()Main()Main(){{{{

    RRRRéééészvszvszvszvéééénynynyny IBM = IBM = IBM = IBM = newnewnewnew RRRRéééészvszvszvszvéééény(ny(ny(ny("IBM""IBM""IBM""IBM", 77.59, 100); , 77.59, 100); , 77.59, 100); , 77.59, 100); RRRRéééészvszvszvszvéééénynynyny nVidianVidianVidianVidia = = = = newnewnewnew RRRRéééészvszvszvszvéééénynynyny(((("NVDA""NVDA""NVDA""NVDA", 21.49, 100); , 21.49, 100); , 21.49, 100); , 21.49, 100);

    IBM.VIBM.VIBM.VIBM.Véééételtelteltel(50);(50);(50);(50);nVidia.VnVidia.VnVidia.VnVidia.Véééételtelteltel(25);(25);(25);(25);nVidia.nVidia.nVidia.nVidia.ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss(29.15);(29.15);(29.15);(29.15);nVidia.EladnVidia.EladnVidia.EladnVidia.Eladáááássss(50);(50);(50);(50);

    System.System.System.System.ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("IBM: " "IBM: " "IBM: " "IBM: " + + + + IBM.DarabszIBM.DarabszIBM.DarabszIBM.Darabszáááámmmm + + + + " db ($" " db ($" " db ($" " db ($" + + + + IBM.IBM.IBM.IBM.ÉÉÉÉrtrtrtrtéééékkkk() + () + () + () + ")"")"")"")"););););System.System.System.System.ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine((((""""nVidianVidianVidianVidia: " : " : " : " + + + + nVidia.DarabsznVidia.DarabsznVidia.DarabsznVidia.Darabszáááámmmm + + + + " db ($" " db ($" " db ($" " db ($" + + + + nVidia.nVidia.nVidia.nVidia.ÉÉÉÉrtrtrtrtéééékkkk() + () + () + () + ")"")"")"")"););););System.System.System.System.ConsoleConsoleConsoleConsole....ReadReadReadReadLine();Line();Line();Line();

    }}}}}}}}

    részvénykezelı.cs

  • Névterek• A névterek az elnevezések tetszıleges logikai

    csoportosítását teszik lehetıvé– Nincs közük a fizikai tároláshoz (fájlokhoz és mappákhoz)

    • Egy fájlban több névtér, egy névtér több fájlban is elhelyezhetı

    – Tetszılegesen egymásba ágyazhatók• A beágyazott névterek tagjait a „ . ” karakterrel választhatjuk el

    – A névtérbe be nem sorolt elemek egy ún. globális névtérbe kerülneknamespacenamespacenamespacenamespace AAAA{{{{

    namespacenamespacenamespacenamespace BBBB{{{{

    classclassclassclass EgyikEgyikEgyikEgyik {{{{…………}}}}}}}}

    }}}}

    …………A.B.A.B.A.B.A.B.EgyikEgyikEgyikEgyik ppppéééélda = lda = lda = lda = newnewnewnew A.B.A.B.A.B.A.B.EgyikEgyikEgyikEgyik();();();();

    namespacenamespacenamespacenamespace A.BA.BA.BA.B{{{{

    classclassclassclass MMMMáááásiksiksiksik {{{{…………}}}}}}}}namespacenamespacenamespacenamespace CCCC{{{{

    classclassclassclass HarmadikHarmadikHarmadikHarmadik {{{{…………}}}}}}}}…………A.B.A.B.A.B.A.B.MMMMáááásiksiksiksik ppppéééélda2 = lda2 = lda2 = lda2 = newnewnewnew A.B.A.B.A.B.A.B.MMMMáááásiksiksiksik();();();();C.C.C.C.HarmadikHarmadikHarmadikHarmadik ppppéééélda3 = lda3 = lda3 = lda3 = newnewnewnew C.C.C.C.HarmadikHarmadikHarmadikHarmadik();();();();

    Ez a két névtér azonos (A.B)

    x.cs y.cs

  • Névterek (folytatás)• Minden névre a saját névterével együtt kell hivatkozni

    – A teljes (minısített) név formája: névtér.elnevezés– A névterek importálhatók (hivatkozás céljára elıkészíthetık) a using

    kulcsszó segítségével• Ezt követıen az adott névtérben található elnevezések elé hivatkozáskor nem kell

    kiírni a névteret, feltéve, hogy az elnevezés így is egyértelmően azonosítható

    – A névtereknek importálás helyett álnév is adható• Célja a hosszú, de importálni nem kívánt névterek egyértelmő rövidítése

    – A névterek Microsoft által javasolt formátuma: Cégnév.Technológia.Funkció[.Design]• Példa: Microsoft.VisualBasic.CompilerServices

    usingusingusingusing System;System;System;System;usingusingusingusing System.TextSystem.TextSystem.TextSystem.Text;;;;

    usingusingusingusing System;System;System;System;usingusingusingusing SOAP = SOAP = SOAP = SOAP = System.Runtime.Serialization.Formatters.SoapSystem.Runtime.Serialization.Formatters.SoapSystem.Runtime.Serialization.Formatters.SoapSystem.Runtime.Serialization.Formatters.Soap;;;;…………SOAP.SOAP.SOAP.SOAP.SoapFormatterSoapFormatterSoapFormatterSoapFormatter fffformormormormáááázzzzóóóó = = = = newnewnewnew SOAP.SOAP.SOAP.SOAP.SoapFormatterSoapFormatterSoapFormatterSoapFormatter();();();();ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(form(form(form(formáááázzzzóóóó););););

    Nem importált névtér álnévvel

    Importált névtér

  • Hatókörök• Kijelöli a változók érvényességi tartományát

    – Nem azonos a névtérrel (amely a hivatkozás módját szabályozza)

    • A C# hatókörre vonatkozó szabályai:– Osztályok tagváltozói csak ott érhetık el, ahol az osztály is elérhetı– Helyi változók a deklarációjukat tartalmazó blokk vagy metódus

    lezárásáig („ } ”) érhetık el– A for, foreach, while, do…while utasításokban deklarált helyi változók csak

    az adott utasítás belsejében érhetık el– Ha egy változó érvényes, de nem azonosítható egyértelmően, akkor a

    C# a hivatkozást a legbelsı érvényességi tartományra vonatkoztatja• Azonos érvényességi tartományon belül azonos néven nem hozhatók létre változók• A tagváltozók érvényességi tartományában létrehozhatók azonos nevő helyi változók• Ebben az esetben a legbelsı változó „elrejti” a vele azonos nevő, hozzá képest külsı

    szinten elhelyezkedı változókat• Ha a legbelsı érvényességi tartományban egy azonos nevő külsı tagváltozót

    kívánunk elérni, akkor példány szintő változók esetén a this kulcsszót, osztály szintőváltozók esetén az osztály nevét kell a változó elé írnunk „ . ” karakterrel elválasztva

  • Láthatósági szintek• Láthatósági (hozzáférési) szintek a C# nyelvben

    1 A .NET biztosít még egy további láthatósági szintet („protected and internal”), amelyet a C# nyelv nem támogat

    – A névterek láthatósága mindig public– A típusok (osztályok) láthatósága public vagy internal (alapértelmezés)– Az osztályok tagjainak láthatósága tetszılegesen megválasztható

    • A tagok láthatósága alapértelmezésben mindig private• A beágyazott típusok (osztályok) láthatóság szempontjából normál tagoknak

    minısülnek (láthatóságuk tetszılegesen megadható, alapértelmezésben private)• A felsorolások elemeinek és az interfészek* tagjainak láthatósága mindig public

    Adott osztályprivateprivateprivateprivate

    .NET1Adott program, adott osztály és leszármazottai*protectedprotectedprotectedprotected internalinternalinternalinternal

    .NETAdott program, adott osztályinternalinternalinternalinternal

    Adott osztály és leszármazottai*protectedprotectedprotectedprotected

    Korlátlanpublicpublicpublicpublic

    MegjegyzésHozzáférési lehetıség az adott taghozSzint

  • Metódusok átdefiniálása• Egy osztályon belül is létrehozhatunk több azonos

    nevő, de eltérı paraméterlistával és visszatérési értékkel rendelkezı metódust– Ezzel a technikával ugyanazt a funkciót többféle paraméterekkel és

    visszatérési értékkel is meg tudjuk valósítani ugyanazon a néven– Logikusabb, átláthatóbb programozási stílust tesz lehetıvé

    classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    …………publicpublicpublicpublic voidvoidvoidvoid VVVVéééétel(tel(tel(tel(intintintint mennyismennyismennyismennyiséééég)g)g)g){{{{ // A param// A param// A param// A paramééééterben megadott mennyisterben megadott mennyisterben megadott mennyisterben megadott mennyisééééggggőőőő rrrréééészvszvszvszvéééény vny vny vny váááássssáááárlrlrlrláááásasasasa

    darabszdarabszdarabszdarabszáááám += mennyism += mennyism += mennyism += mennyiséééég;g;g;g;}}}}publicpublicpublicpublic voidvoidvoidvoid VVVVéééétel(tel(tel(tel(intintintint mennyismennyismennyismennyiséééég, g, g, g, doubledoubledoubledouble áááárfolyam)rfolyam)rfolyam)rfolyam){{{{ // A param// A param// A param// A paramééééterben megadott mennyisterben megadott mennyisterben megadott mennyisterben megadott mennyisééééggggőőőő rrrréééészvszvszvszvéééény vny vny vny váááássssáááárlrlrlrláááása a megadott sa a megadott sa a megadott sa a megadott áááárfolyam berfolyam berfolyam berfolyam beáááállllllllííííttttáááássssáááávalvalvalval

    darabszdarabszdarabszdarabszáááám += mennyism += mennyism += mennyism += mennyiséééég;g;g;g;thisthisthisthis....áááárfolyamrfolyamrfolyamrfolyam = = = = áááárfolyam;rfolyam;rfolyam;rfolyam;

    }}}}}}}}

  • 2006. szeptember 8. 23V1.2

    Feladat

    Készítsünk algoritmust, majd programot, amely nem negatív és 100-nál kisebb véletlen egész számokkal feltölt egy kétdimenziós, 3x3-as tömböt, majd a kiírja a tömb teljes tartalmát!

    A Random osztály néhány metódusa:a Next() metódus egy nem negatív egész számot,a Next(int32) metódus egy nem negatív, a megadott határnál kisebb egész számot,a Next(int32, int32) metódus a két határ közötti egész számot,a NextDouble() metódus egy 0 és 1 között lebegıpontos számotad vissza.

  • Osztály szintű tagok• Az osztály szintő mezık az osztály saját adatmezıi

    – Minden osztály csak egyet tárol ezekbıl a mezıkbıl, függetlenül a késıbb létrehozott példányok számától• Ezeket a mezıket tehát nem a példányok, hanem maga az osztály birtokolja

    • Az osztály szintő metódusok magán az osztályon mőködnek– Akkor is hívhatók, ha még egyetlen példány sem létezik az osztályból

    • Csak osztály szintő mezıket használhatnak• Osztály szintő metódusoknál nem létezik aktuális objektum, így this paraméter sem• Konkrét példányt nem igénylı feladatra is alkalmasak (pl. fıprogram megvalósítása)

    • Az osztály szintő tagokat a staticstaticstaticstatic kulcsszóval jelöljük // // // // …é…é…é…és most ms most ms most ms most máááár minden kulcsszr minden kulcsszr minden kulcsszr minden kulcsszóóóót kt kt kt köööönnyen felismerhetnnyen felismerhetnnyen felismerhetnnyen felismerhetüüüünk ebben a "bonyolult" programbannk ebben a "bonyolult" programbannk ebben a "bonyolult" programbannk ebben a "bonyolult" programban☺☺☺☺classclassclassclass ElsElsElsElsııııProgramProgramProgramProgram{{{{

    publicpublicpublicpublic static voidstatic voidstatic voidstatic void Main()Main()Main()Main(){{{{

    System.System.System.System.ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("Hello, C# World""Hello, C# World""Hello, C# World""Hello, C# World"););););}}}}

    }}}}

  • Osztály szintű tagok (példa, 1. rész)usingusingusingusing System;System;System;System;

    classclassclassclass PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó{{{{

    publicpublicpublicpublic staticstaticstaticstatic int int int int DarabszDarabszDarabszDarabszáááám;m;m;m;

    staticstaticstaticstatic PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó()()()(){{{{

    DarabszDarabszDarabszDarabszáááám = 0;m = 0;m = 0;m = 0;}}}}publicpublicpublicpublic PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó()()()(){{{{

    DarabszDarabszDarabszDarabszáááám++;m++;m++;m++;}}}}~P~P~P~Pééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó()()()(){{{{

    DarabszDarabszDarabszDarabszáááámmmm--------;;;;ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("Megsz"Megsz"Megsz"Megszőőőőnt egy pnt egy pnt egy pnt egy pééééldldldldáááány. A fennmaradny. A fennmaradny. A fennmaradny. A fennmaradóóóók szk szk szk szááááma: "ma: "ma: "ma: " + Darabsz+ Darabsz+ Darabsz+ Darabszáááám);m);m);m);

    }}}}}}}}

    példányszámláló.cs

    Osztály szintő adatmezı

    Osztály szintő konstruktor(egyik fı célja az osztály szintő mezık

    kezdeti értékének beállítása)

    Konstruktor

    Destruktor

  • Osztály szintű tagok (példa, 2. rész)classclassclassclass PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóóTesztTesztTesztTeszt{{{{

    staticstaticstaticstatic voidvoidvoidvoid Main()Main()Main()Main(){{{{

    PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó teszt = teszt = teszt = teszt = newnewnewnew PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó();();();();ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("L"L"L"Léééétrehoztam egy ptrehoztam egy ptrehoztam egy ptrehoztam egy pééééldldldldáááányt"nyt"nyt"nyt"););););ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine("P("P("P("Pééééldldldldáááánysznysznysznyszáááám: "m: "m: "m: " + + + + PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó.Darabsz.Darabsz.Darabsz.Darabszáááámmmm););););

    forforforfor (int i = 0; i < 10; i++)(int i = 0; i < 10; i++)(int i = 0; i < 10; i++)(int i = 0; i < 10; i++)newnewnewnew PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó();();();();

    ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("L"L"L"Léééétrehoztam mtrehoztam mtrehoztam mtrehoztam méééég tg tg tg tííííz pz pz pz pééééldldldldáááányt"nyt"nyt"nyt"););););ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine("P("P("P("Pééééldldldldáááánysznysznysznyszáááám: "m: "m: "m: " + + + + PPPPééééldldldldáááánysznysznysznyszáááámlmlmlmláááállllóóóó.Darabsz.Darabsz.Darabsz.Darabszáááámmmm););););

    ConsoleConsoleConsoleConsole.ReadLine.ReadLine.ReadLine.ReadLine();();();();}}}}

    }}}}

    példányszámláló.cs

  • Feladat 1.

    Készítsen programot a háromelemő valós vektorok kezelésére az alábbi menüpon-tokkal.

    • Beolvasás• Kiíratás

    Használjon statikus (osztály szintő) metódusokat!

  • Megoldás stat. metódusokkal I.class vektordef{public static void beolvas(float [] partomb){for(int i=0;i

  • Megoldás stat. metódusokkal II.

    class vektorkez{static void Main(){float [] vektor=new float[3];vektordef.beolvas(vektor);vektordef.kiír(vektor);

    }}

  • 2006. szeptember 8. 30V1.2

    Feladat 1.b.

    Készítse el az 1. Feladatban leírtakat objektum példány használatával!

  • 2006. szeptember 8. 31V1.2

    Megoldás példánnyal I.class vektordef{public void beolvas(float [] partomb){for(int i=0;i

  • Megoldás obj. pld.-al I.

    class vektordef{public void beolvas(float [] partomb){for(int i=0;i

  • 2006. szeptember 8. 33V1.2

    Megoldás példánnyal II.

    class vektorkez{static void Main(){float [] vektor=new float[3];vektordef sajvekt=new vektordef(); sajvekt.beolvas(vektor);sajvekt.kiír(vektor);

    }}

    Oblektumpéldány

    létrehozása.

  • Feladat 2.

    Egészítse ki a háromelemő valós vektorok kezelésére készített programot az alábbi menüpontokkal.

    • Skaláris szorzat.• Skalárral való szorzás.

    Használjon objektum példányt!

  • Skaláris szorzat

    public float skalarissz(float [] partomb1,float [] partomb2){float s=0;for(int i=0;i

  • Szorzás skalárral a.

    public void skalarralsz(float [] partomb, float k){

    for(int i=0;i

  • Szorzás skalárral b.

    public float [] skalarralsz(float [] partomb, float k){float [] p=new float[3]; for(int i=0;i

  • Megoldás obj. pld-al főprg. a.class vektorkez{static void Main(){float [] vektor1=new float[3];float [] vektor2=new float[3];float [] vektor3=new float[3];float v;vektordef sajvekt=new vektordef();sajvekt.beolvas(vektor1);sajvekt.beolvas(vektor2);sajvekt.skalarralsz(vektor1,3);vektor3=vektor1;v=sajvekt.skalarissz(vektor3,vektor2);sajvekt.kiír(vektor3);System.Console.WriteLine(v);System.Console.ReadLine();

    }}

    Oblektumpéldány

    létrehozása.

    A visszaadott érték

  • Megoldás obj. pld-al főprg. b.

    class vektorkez{static void Main(){float [] vektor1=new float[3];float [] vektor2=new float[3];float [] vektor3=new float[3];float v;vektordef sajvekt=new vektordef();sajvekt.beolvas(vektor1);sajvekt.beolvas(vektor2);vektor3=sajvekt.skalarralsz(vektor1,3);v=sajvekt.skalarissz(vektor3,vektor2);sajvekt.kiír(vektor3);System.Console.WriteLine(v);System.Console.ReadLine();

    }}

    Oblektumpéldány

    létrehozása.

    A visszaadott érték

  • Feladat 3.

    Adott, hogy egy vállalat három gépkocsija hány km-t futott az elsı illetve a második félévben. Ismert továbbá az elsı féléves üzemel-tetési költség autók szerint km-enként. Ez a költség a második félévre 5%-kal emelkedett.Határozza meg a gépkocsik éves összköltségét!

  • 2006. szeptember 8. 41V1.2

    Feladat 4.Egészítse ki a háromelemő valós vektorok kezelésére készített programot az alábbi menüpontokkal:• Oszlopvektor és sorvektor szorzata (lehetkülönbözı hosszúságú).• Kiírás két dimenziós tömbre ugyanazona néven, mint a vektorok esetén (nem ismert az oszlop és sorhossz)!

    Használjon objektum példányt!

  • 2006. szeptember 8. 42V1.2

    Feladat 5.

    Adott, egy vállalat három gépkocsijának üzemeltetési költsége autók szerint km-enként. Ismert a leggyakoribb 4 úticél távolsága.Határozza meg a gépkocsik költségét ezekhez az úticélokhoz gépkocsinként ésúticélonként!

  • 2006. szeptember 8. 43V1.2

    A this paraméter• A példány szintő metódusokban szükség lehet rá,

    hogy hivatkozni tudjunk arra az objektumra, amelyik a metódust éppen végrehajtja

    • E hivatkozás a rejtett thisthisthisthis paraméter segítségével valósul meg– A rejtett this paraméter minden példány szintő metódusban az aktuális

    objektumot jelöli• Osztály szintő tagok esetén ez a paraméter nem létezik (az osztály szintő tagokat

    lásd késıbb)

    – Nem kell deklarálni, ezt a fordítóprogram automatikusan megteszi– Általában a következı esetekben használatos:

    • Az aktuális objektumot paraméterként vagy eredményként szeretnénk átadni• Az érvényes hatókörön belül több azonos nevő tag található (pl. egymásba ágyazott

    hatókörök vagy névterek esetén), így ezek a tagok csak segítséggel azonosíthatók egyértelmően

  • 2006. szeptember 8. 44V1.2

    A this paraméter (példa)• Milyen nehézség adódott volna, ha az 1. példában az

    alábbi mezıneveket használjuk?classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    privateprivateprivateprivate stringstringstringstring nnnnéééév;v;v;v;privateprivateprivateprivate doubledoubledoubledouble áááárfolyam;rfolyam;rfolyam;rfolyam;publicpublicpublicpublic intintintint darabszdarabszdarabszdarabszáááám;m;m;m;

    publicpublicpublicpublic RRRRéééészvszvszvszvéééénynynyny((((stringstringstringstring nnnnéééév, v, v, v, doubledoubledoubledouble áááárfolyam, rfolyam, rfolyam, rfolyam, intintintint darabszdarabszdarabszdarabszáááámmmm)))){{{{

    rrrréééészvszvszvszvéééénynnynnynnynéééév = nv = nv = nv = néééév;v;v;v;rrrréééészvszvszvszvéééénynynynyáááárfolyam = rfolyam = rfolyam = rfolyam = áááárfolyam;rfolyam;rfolyam;rfolyam;DarabszDarabszDarabszDarabszáááám = m = m = m = darabszdarabszdarabszdarabszáááámmmm;;;;

    }}}}

    publicpublicpublicpublic voidvoidvoidvoid ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss((((doubledoubledoubledouble áááárfolyam)rfolyam)rfolyam)rfolyam){{{{

    rrrréééészvszvszvszvéééénynynynyáááárfolyam = rfolyam = rfolyam = rfolyam = áááárfolyam;rfolyam;rfolyam;rfolyam;}}}}

    }}}}

    Probléma: hogyan tudjuk módosítani a „Részvény”osztály „név”, „árfolyam” és „darabszám” nevő mezıit?

  • 2006. szeptember 8. 45V1.2

    A this paraméter (példa)• Megoldás a thisthisthisthis paraméter segítségével

    classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    privateprivateprivateprivate stringstringstringstring nnnnéééév;v;v;v;privateprivateprivateprivate doubledoubledoubledouble áááárfolyam;rfolyam;rfolyam;rfolyam;publicpublicpublicpublic intintintint darabszdarabszdarabszdarabszáááám;m;m;m;

    publicpublicpublicpublic RRRRéééészvszvszvszvéééénynynyny((((stringstringstringstring nnnnéééév, v, v, v, doubledoubledoubledouble áááárfolyam, rfolyam, rfolyam, rfolyam, intintintint darabszdarabszdarabszdarabszáááámmmm)))){{{{

    thisthisthisthis.n.n.n.néééévvvv = n= n= n= néééév;v;v;v;thisthisthisthis....áááárfolyamrfolyamrfolyamrfolyam = = = = áááárfolyam;rfolyam;rfolyam;rfolyam;thisthisthisthis.darabsz.darabsz.darabsz.darabszáááámmmm = darabsz= darabsz= darabsz= darabszáááám;m;m;m;

    }}}}

    publicpublicpublicpublic voidvoidvoidvoid ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss((((doubledoubledoubledouble áááárfolyam)rfolyam)rfolyam)rfolyam){{{{

    thisthisthisthis....áááárfolyamrfolyamrfolyamrfolyam = = = = áááárfolyam;rfolyam;rfolyam;rfolyam;}}}}

    }}}}

  • Beágyazott osztályok• Az osztályok tetszıleges mélységben egymásba

    ágyazhatók– Az egymásba ágyazással logikai tartalmazást jelezhetünk

    • Az egymásba ágyazás nem jelent hierarchikus alá-, illetve fölérendelést

    – A beágyazott típusok (osztályok) láthatóság szempontjából normál tagoknak minısülnek (láthatóságuk tehát tetszılegesen megadható, alapértelmezésben private)

    • Beágyazott osztályokra azok teljes (minısített) nevével hivatkozhatunk– A hivatkozás formája: osztály.beágyazottosztály

  • Beágyazott osztályok (példa)usingusingusingusing System;System;System;System;

    classclassclassclass KKKKüüüülslslslsııııOsztOsztOsztOsztáááálylylyly{{{{

    publicpublicpublicpublic classclassclassclass BelsBelsBelsBelsııııOsztOsztOsztOsztáááálylylyly{{{{

    publicpublicpublicpublic voidvoidvoidvoid ÜÜÜÜzenzenzenzenıııı()()()(){{{{

    ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("Hurr"Hurr"Hurr"Hurráááá, bel, bel, bel, belüüüül vagyunk!"l vagyunk!"l vagyunk!"l vagyunk!"););););}}}}

    }}}}

    publicpublicpublicpublic voidvoidvoidvoid ÜÜÜÜzenzenzenzenıııı()()()(){{{{

    ConsoleConsoleConsoleConsole.WriteLine.WriteLine.WriteLine.WriteLine(((("K"K"K"Kíííívvvvüüüül vagyunk."l vagyunk."l vagyunk."l vagyunk."););););}}}}

    }}}}…………KKKKüüüülslslslsııııOsztOsztOsztOsztáááálylylyly K = K = K = K = newnewnewnew KKKKüüüülslslslsııııOsztOsztOsztOsztáááálylylyly();();();();KKKKüüüülslslslsııııOsztOsztOsztOsztáááálylylyly....BelsBelsBelsBelsııııOsztOsztOsztOsztáááálylylyly B = B = B = B = newnewnewnew KKKKüüüülslslslsııııOsztOsztOsztOsztáááálylylyly....BelsBelsBelsBelsııııOsztOsztOsztOsztáááálylylyly();();();();K.K.K.K.ÜÜÜÜzenzenzenzenıııı();();();();B.B.B.B.ÜÜÜÜzenzenzenzenıııı();();();(); beágyazottosztályok.cs

  • Felbontott típusok• A felbontott típusok több fizikai részre osztott, logikai

    szempontból viszont egységes típusok– Példa: egy-egy osztály forráskódja elosztva, több fájlban is tárolható– A felbontott típusok minden részét a partial kulcsszóval kell megjelölni– Elınye, hogy a típusok úgy oszthatók meg több programozó vagy

    automatikus kódgenerátor között, hogy fizikailag nem kell osztozniuk a forrásfájlokon• Különválasztható (és ezáltal külön fejleszthetı és verzionálható) az osztályok

    automatikusan, illetve kézzel elıállított része• Különválasztható az egyes osztályok kódján dolgozó fejlesztıcsapatok munkája is

    • A felbontott típusok elemeit a C# fordító összefésüli– A fordító úgy kezeli az elemeket, mintha egy fájlban, egy

    típusdefinícióként hoztuk volna létre ıket• Ellentmondás esetén a fordítás nem lehetséges• A felbontott típusok elemei csak együtt, egyszerre fordíthatók le

    – Nem lehetséges tehát már lefordított osztályokat utólag ilyen technikával bıvíteni

  • Felbontott típusok (példa)partialpartialpartialpartial classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    privateprivateprivateprivate readonlyreadonlyreadonlyreadonly stringstringstringstring rrrréééészvszvszvszvéééénynnynnynnynéééév;v;v;v;privateprivateprivateprivate doubledoubledoubledouble rrrréééészvszvszvszvéééénynynynyáááárfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;publicpublicpublicpublic intintintint DarabszDarabszDarabszDarabszáááám;m;m;m;

    publicpublicpublicpublic RRRRéééészvszvszvszvéééénynynyny((((stringstringstringstring nnnnéééév, v, v, v, doubledoubledoubledouble áááárfolyam, rfolyam, rfolyam, rfolyam, intintintint darabszdarabszdarabszdarabszáááámmmm)))) {{{{…………}}}}}}}}

    partialpartialpartialpartial classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    publicpublicpublicpublic voidvoidvoidvoid VVVVéééétel(tel(tel(tel(intintintint mennyismennyismennyismennyiséééég) g) g) g) {{{{…………}}}}publicpublicpublicpublic voidvoidvoidvoid EladEladEladEladáááás(s(s(s(intintintint mennyismennyismennyismennyiséééég) g) g) g) {{{{…………}}}}publicpublicpublicpublic voidvoidvoidvoid ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss((((doubledoubledoubledouble áááárfolyam) rfolyam) rfolyam) rfolyam) {{{{…………}}}}publicpublicpublicpublic doubledoubledoubledouble ÉÉÉÉrtrtrtrtéééék() k() k() k() {{{{…………}}}}

    }}}}

    Részvény_KovácsJános.cs

    classclassclassclass RRRRéééészvszvszvszvéééénynynyny{{{{

    privateprivateprivateprivate readonlyreadonlyreadonlyreadonly stringstringstringstring rrrréééészvszvszvszvéééénynnynnynnynéééév;v;v;v;privateprivateprivateprivate doubledoubledoubledouble rrrréééészvszvszvszvéééénynynynyáááárfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;rfolyam = 0.0;publicpublicpublicpublic intintintint DarabszDarabszDarabszDarabszáááám;m;m;m;

    publicpublicpublicpublic RRRRéééészvszvszvszvéééénynynyny((((stringstringstringstring nnnnéééév, v, v, v, doubledoubledoubledouble áááárfolyam, rfolyam, rfolyam, rfolyam, intintintint darabszdarabszdarabszdarabszáááámmmm)))) {{{{…………}}}}

    publicpublicpublicpublic voidvoidvoidvoid VVVVéééétel(tel(tel(tel(intintintint mennyismennyismennyismennyiséééég) g) g) g) {{{{…………}}}}publicpublicpublicpublic voidvoidvoidvoid EladEladEladEladáááás(s(s(s(intintintint mennyismennyismennyismennyiséééég) g) g) g) {{{{…………}}}}publicpublicpublicpublic voidvoidvoidvoid ÁÁÁÁrfolyamBerfolyamBerfolyamBerfolyamBeáááállllllllííííttttáááássss((((doubledoubledoubledouble áááárfolyam) rfolyam) rfolyam) rfolyam) {{{{…………}}}}publicpublicpublicpublic doubledoubledoubledouble ÉÉÉÉrtrtrtrtéééék() k() k() k() {{{{…………}}}}

    }}}}

    Részvény_SzabóPéter.cs

  • 2006. szeptember 8. 50V1.2

    Feladat 4.Készítsen „Vonatdef” osztályt, melyben A „beolvas” metódusban megadható egy vonat neve, az állomások neve, az indulások ideje (max 100 db), és ezek az osztály adattételeiben tárolódnak.Az üres állomásnév jelentse a beolvasás végét.A „kiír” metódus kiírja azokat a képernyıre.

    Készítsen „Vonatkez” osztályt, melyben a fenti osztály két példányába beírja az adatokat, majd kiírja azokat a képernyıre.

  • 2006. szeptember 8. 51V1.2

    Feladat 4a.

    Készítsen a „Vonatdef” osztályban olyan metódust, mely a vonat nevét képes megváltoztatni.

  • 2006. szeptember 8. 52V1.2

    Feladat 4b.

    Végezze el ugyanezt a „beolvas” metódus átdefiniálásával.