-
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.