objektumorientált programozás c# nyelvenobjektumorientált programozás c# nyelven 1. rész...

52
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

Upload: others

Post on 24-Oct-2020

5 views

Category:

Documents


0 download

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.