objektumorientált programozás c# nyelvenobjektumorientált programozás c# nyelven 1. rész...
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.