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
Hallgatói tájékoztató 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.
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 class 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) class Példaoszt ldaosztály ly // Itt kell deklarálnunk lnunk az osztály összes tagját t (mezıket, metódusokat dusokat ) // A metódusok konkrét megvalósítását t szintén n itt kell megadnunk 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
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) string jegy = "jeles"; int j = -10 10; 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 readonly string SosemVáltozomMeg = "I Will Stay The Same"; Konstans mezık Értéküket a fordítóprogram elıre letárolja, futási idıben sosem módosíthatók const double π = 3.14159265; const int ö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ó) void EgyparaméteresMet teresmetódus dus(bool feltétel) tel) void Többparam bbparaméteresmet teresmetódus dus(int a, float b, string c) void MindenbılSokatElfogad lsokatelfogadómet Metódus dus(params object[] paramétert tertömb mb) Visszatérési értékkel Nem kötelezı, ha nincs, ezt a void kulcsszóval kell jelölni void NincsVisszatérési siért rtékem kem() int EgészSz szszámotadokvissza motadokvissza(float paraméter) string VálaszomEgyKaraktersorozat laszomegykaraktersorozat(string string bemenıadat Adat) SajátT ttípus Átalak talakító(saj SajátT ttípus forrásobjektum sobjektum, int egyikmezıújért rtéke ke, string másikmez sikmezıújért rtéke ke) 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
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éterei A 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 return alapszó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-re class 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(); Példány létrehozás Változtatható paraméter
Példa out-ra class Out public void kiír(int a, out int b) b=a; Példány létrehozás 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éter
Példa a Main() fv. paraméterére class Bepar static void Main(string[] args) int i; for (i=0;i<args.length-1; i=i+1) System.Console.Write(args[i]+" "); if (args.length>0) System.Console.WriteLine(args[i]); System.Console.ReadLine(); Stringek száma Paraméter Paraméter stringek
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ó automatikusan létrehoz egy paraméter nélküli alapértelmezett konstruktort Új objektum a new 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.Object Igaziİsk skövület = new System.Object Object(); Paraméter nélküli konstruktor hívása SajátT ttípus péld ldány = new SajátT ttípus pus(25); 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 SajátT Destruktorra ttípus ritkán van szükség class Saj // Destruktor ~Saj SajátT ttípus pus()
class Részv szvény private readonly string részv szvényn nynév; private double részv szvény nyárfolyam = 0.0; public int Darabszám; 1. példa public Részv szvény ny(string név, double árfolyam, int darabszám) // Konstruktor (neve megegyezik az osztály nevével) vel) - beáll llítja az adatmezık kezdeti ért rtékét public void Vétel( tel(int mennyiség) // A paraméterben megadott mennyiségő részv szvény vásárlv rlása public void Eladás( s(int mennyiség) // A paraméterben megadott mennyiségő részv szvény eladása public void ÁrfolyamBe rfolyambeáll llítás(double árfolyam) // Az aktuális árfolyam beáll llítása a paraméterben megadott árfolyam alapján public double Ért rték() // Részv szvény össz sszért rtékének kiszámítása sa részvénykezelı.cs
1. példa (folytatás) class Részv szvénykezel nykezelı static void Main() Részv szvény IBM = new Részv szvény( ny("ibm" "IBM",, 77.59, 100); Részv szvény nvidia = new Részv szvény ny("nvda" "NVDA",, 21.49, 100); IBM.Vétel tel(50); nvidia.vétel tel(25); nvidia.árfolyambe rfolyambeáll llítás(29.15); nvidia.eladás(50); System.Console Console.WriteLine.WriteLine("IBM: " + IBM.Darabszám + " db ($" + IBM.Ért rték() + ")"); ); System.Console Console.WriteLine.WriteLine("nVidia nvidia: : " + nvidia.darabszám + " db ($" + nvidia.ért rték() + ")"); ); System.Console Console.Read ReadLine(); 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ülnek namespace A namespace B class Egyik A.B.Egyik példa = new A.B.Egyik Egyik(); Ez a két névtér azonos (A.B) x.cs namespace A.B class Másik namespace C class Harmadik A.B.Másik példa2 = new A.B.Másik sik(); C.Harmadik példa3 = new C.Harmadik Harmadik(); 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 using System; using System.Text; 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 Importált névtér using System; using SOAP = System.Runtime.Serialization.Formatters.Soap; SOAP.SoapFormatter SoapFormatter form ormázó = new SOAP.SoapFormatter SoapFormatter(); Console.WriteLine.WriteLine(form (formázó); A névterek Microsoft által javasolt formátuma: Cégnév.Technológia.Funkció[.Design] Példa: Microsoft.VisualBasic.CompilerServices Nem importált névtér álnévvel
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 Szint public protected internal protected internal private Hozzáférési lehetıség az adott taghoz Korlátlan Adott osztály és leszármazottai* Adott program, adott osztály Adott program, adott osztály és leszármazottai* Adott osztály Megjegyzés.NET.NET 1 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
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é class Részv szvény public void Vétel( tel(int mennyiség) // A paraméterben megadott mennyiségő részv szvény vásárlv rlása darabszám += mennyiség; public void Vétel( tel(int mennyiség, double árfolyam) // A paraméterben megadott mennyiségő részv szvény vásárlv rlása a megadott árfolyam beáll llításával darabszám += mennyiség; this.árfolyam = árfolyam;
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ámot ad vissza. V1.2 2006. szeptember 8. 23
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 és most osztály már minden szintő kulcsszót tagokat könnyen felismerhetünk a static ebben kulcsszóval a "bonyolult" programban jelöljük class ElsıProgram public static void Main() System.Console Console.WriteLine.WriteLine("Hello, C# World");
Osztály szintű tagok (példa, 1. rész) using System; class Péld ldánysz nyszáml mláló public static int Darabszám; 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) static Péld ldánysz nyszáml mláló() Darabszám = 0; Konstruktor public Péld ldánysz nyszáml mláló() Darabszám++; Destruktor ~Péld ldánysz nyszáml mláló() Darabszám-- --; Console.WriteLine.WriteLine("Megsz "Megszőnt egy péld ldány. A fennmaradók száma: " + Darabszám); példányszámláló.cs
Osztály szintű tagok (példa, 2. rész) class Péld ldánysz nyszáml mlálóteszt static void Main() Péld ldánysz nyszáml mláló teszt = new Péld ldánysz nyszáml mláló(); Console.WriteLine.WriteLine("L "Létrehoztam egy péld ldányt" nyt"); Console.WriteLine.WriteLine("P ("Péld ldánysz nyszám: " + Péld ldánysz nyszáml mláló.darabsz.darabszám); for (int i = 0; i < 10; i++) new Péld ldánysz nyszáml mláló(); Console.WriteLine.WriteLine("L "Létrehoztam még tíz t péld ldányt" nyt"); Console.WriteLine.WriteLine("P ("Péld ldánysz nyszám: " + Péld ldánysz nyszáml mláló.darabsz.darabszám); Console.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üpontokkal. Beolvasás Kiíratás Használjon statikus (osztály szintő) metódusokat!
Megoldás stat. metódusokkal I. class vektordef A sorrend teszıleges public static void beolvas(float [] partomb) for(int i=0;i<3; i++) Kötelezıen a metódus neve elıtt System.Console.WriteLine( Az"+(i+1)+"-ik elem: "); partomb[i]=float.parse(system.console.readline()); public static void kiír(float [] partomb) for(int i=0;i<3; i++) System.Console.WriteLine(partomb[i]); return; Nincs visszatérı érték, egy kimenet van, így a return nem kötetelezı
Megoldás stat. metódusokkal II. class vektorkez static void Main() float [] vektor=new float[3]; vektordef.beolvas(vektor); vektordef.kiír(vektor);
Feladat 1.b. Készítse el az 1. Feladatban leírtakat objektum példány használatával! V1.2 2006. szeptember 8. 30
class vektordef Megoldás példánnyal I. Nincs static. public void beolvas(float [] partomb) for(int i=0;i<3; i++) Kötelezıen a metódus neve elıtt System.Console.WriteLine( Az"+(i+1)+"-ik elem: "); partomb[i]=float.parse(system.console.readline()); public void kiír(float [] partomb) for(int i=0;i<3; i++) System.Console.WriteLine(partomb[i]); return; V1.2 Nincs visszatérı érték, egy kimenet van, így a return nem kötetelezı 2006. szeptember 8. 31
class vektordef Megoldás obj. pld.-al I. Nincs static. public void beolvas(float [] partomb) for(int i=0;i<3; i++) System.Console.WriteLine("Az"+(i+1)+"-ik elem: "); partomb[i]=float.parse(system.console.readline()); public void kiír(float [] partomb) for(int i=0;i<3; i++) System.Console.WriteLine(partomb[i]);
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); Oblektum példány létrehozása. V1.2 2006. szeptember 8. 33
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<3; i++) s=s+partomb1[i]*partomb2[i]; return s;
Szorzás skalárral a. A visszaadott érték public void skalarralsz(float [] partomb, float k) for(int i=0;i<3; i++) partomb[i]=partomb[i]*k;
Szorzás skalárral b. public float [] skalarralsz(float [] partomb, float k) float [] p=new float[3]; for(int i=0;i<3; i++) p[i]=partomb[i]*k; return p; A visszaadott érték
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(); A visszaadott érték Oblektum példány létrehozása.
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(); Oblektum pé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 üzemelteté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!
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 (lehet különbözı hosszúságú). Kiírás két dimenziós tömbre ugyanazon a néven, mint a vektorok esetén (nem ismert az oszlop és sorhossz)! Használjon objektum példányt! V1.2 2006. szeptember 8. 41
Feladat 5. Adott, egy vállalat három gépkocsijának üzemeltetési költsége autók szerint kmenké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! V1.2 2006. szeptember 8. 42
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 this 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 V1.2 2006. szeptember 8. 43
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? class Részv szvény private string név; private double árfolyam; public int darabszám; public Részv szvény ny(string név, double árfolyam, int darabszám) részv szvényn nynév = név; részv szvény nyárfolyam = árfolyam; Darabszám = darabszám; Probléma: hogyan tudjuk módosítani a Részvény osztály név, árfolyam és darabszám nevő mezıit? public void ÁrfolyamBe rfolyambeáll llítás(double árfolyam) részv szvény nyárfolyam = árfolyam; V1.2 2006. szeptember 8. 44
A this paraméter (példa) Megoldás a this paraméter segítségével class Részv szvény private string név; private double árfolyam; public int darabszám; public Részv szvény ny(string név, double árfolyam, int darabszám) this.n.név = név; this.árfolyam = árfolyam; this.darabsz.darabszám = darabszám; public void ÁrfolyamBe rfolyambeáll llítás(double árfolyam) this.árfolyam = árfolyam; V1.2 2006. szeptember 8. 45
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
using System; Beágyazott osztályok (példa) class Küls lsıoszt Osztály public class BelsıOszt Osztály public void Üzen zenı() Console.WriteLine.WriteLine("Hurr "Hurrá,, belül l vagyunk!"); public void Üzen zenı() Console.WriteLine.WriteLine("K "Kívül l vagyunk."); Küls lsıoszt Osztály K = new Küls lsıoszt Osztály ly(); Küls lsıoszt Osztály ly.bels BelsıOszt Osztály B = new Küls lsıoszt Osztály ly.bels BelsıOszt Osztály ly(); K.Üzen zenı(); B.Üzen zenı(); (); 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) partial class Részv szvény private readonly string részv szvényn nynév; private double részv szvény nyárfolyam = 0.0; public int Darabszám; class Részv szvény public Részv szvény ny(string név, double árfolyam, int darabszám) private readonly string részv szvényn nynév; private double részv szvény nyárfolyam = 0.0; public int Darabszám; public Részv szvény ny(string név, double árfolyam, int darabszám) partial class Részv public szvény void Vétel( tel(int mennyiség) public void Eladás( s(int mennyiség) public void public Vétel( tel(int void mennyiség) ÁrfolyamBe rfolyambeáll llítás(double árfolyam) public void public Eladás( double s(int mennyiség) Ért rték() public void ÁrfolyamBe rfolyambeáll llítás(double árfolyam) public double Ért rték() Részvény_KovácsJános.cs Részvény_SzabóPéter.cs
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. V1.2 2006. szeptember 8. 50
Feladat 4a. Készítsen a Vonatdef osztályban olyan metódust, mely a vonat nevét képes megváltoztatni. V1.2 2006. szeptember 8. 51
Feladat 4b. Végezze el ugyanezt a beolvas metódus átdefiniálásával. V1.2 2006. szeptember 8. 52