C# osztályok
description
Transcript of C# osztályok
![Page 1: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/1.jpg)
C# osztályok
Krizsán Zoltán
1.0
![Page 2: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/2.jpg)
Krizsán Zoltán, iit C# osztályok 2
Fogalma
Önálló hatáskörrel rendelkező, absztrakt adattípus, amely több, különböző elemet tartalmazhat.
Minden esetben a heap-en jön létre! A programozó hozza létre, de a GC
menedzseli.
![Page 3: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/3.jpg)
Krizsán Zoltán, iit C# osztályok 3
Definíció
[attributes] [modifiers] class <className> [: baseClassName] { [class-body] }[;]
Módosítók lehetnek: new, public, protected, internal, private, abstract, sealed
Hasonló, mint C++-ban, vagy JAVA-ban, nem kötelező a „;” a végén
Nincs jelölve, de minden osztály a System.Object származottja
![Page 4: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/4.jpg)
Krizsán Zoltán, iit C# osztályok 4
Mezők tárolási módjai
Statikus:Egy példány minden objektum számára, osztályhoz kötődik, nem az objektumhoz!
Példány:Minden objektumnak külön példánya van a tagból.
![Page 5: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/5.jpg)
Krizsán Zoltán, iit C# osztályok 5
Mezők hozzáférési módosítói
A tagok elérési szabályozza, minden mező elé ki kell tenni!
private (alapértelmezett): csak az adott osztályból érhető el.
protected: az adott osztályból, és a leszármazottakból érhető el.
internal: csak a szerelvény fv.-ei érhetik el protected internal: az előző kettő összege public: nincs semmilyen korlátozás, minden
szerelvényből
![Page 6: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/6.jpg)
Krizsán Zoltán, iit C# osztályok 6
Osztály részei
Adattagok (Field) - adatok Konstansok (Constant) – állandó adatok Csak olvasható mezők (read only)
Tagfüggvények (Method) – fv.-ek Operátorok (Operator) – speciális tfv.-ek Indexelők (Indexer) – speciális tfv.-ek
Tulajdonságok (Property) – kivűlről adat, belülről fv.
Delegátumok – típusos fv. Pointer osztály Események (Event) – delegátumok
![Page 7: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/7.jpg)
Krizsán Zoltán, iit C# osztályok 7
Adattagok
Osztály hatáskörben definiált változó. Formája:
[attribútum] [módosító] típus azonosító [=kezdő érték][, azonosító [=kezdő érték]];
Módosítók lehetnek:const – konstansreadonly – csak olvasható mezőstatic – statikusvolatile – gyakran változó
![Page 8: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/8.jpg)
Krizsán Zoltán, iit C# osztályok 8
Konstans
Értéke fordítási időben állítódik be, futási időben értéke nem változtatható.
Csak konstans értékét veheti fel. Alapértelmezett tárolási osztálya static. Nem kell példányosítani az osztályt ahhoz,
hogy használjuk MSIL kódban lcd utasítás (load constant) tölti
fel a stack-re.
![Page 9: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/9.jpg)
Krizsán Zoltán, iit C# osztályok 9
Csak olvasható mezők
Futási időben állítható az értéke, de csak egyszer!
Értékét 3 helyen állíthatjuk:konstruktor, statikus konstruktor, vagy a definíció során.
Értékét akár fv. hívás visszatérési értéke is szolgáltathatja!
Az osztály különböző példányaiban a mező különböző étéket vehet fel.
![Page 10: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/10.jpg)
Krizsán Zoltán, iit C# osztályok 10
Osztály részei
Adattagok (Field) - adatok Konstansok (Constant) – állandó adatok Csak olvasható mezők (read only)
Tagfüggvények (Method) – fv.-ek Operátorok (Operator) – speciális tfv.-ek Indexelők (Indexer) – speciális tfv.-ek
Tulajdonságok (Property) – kivülről adat, belülről fv.
Delegátumok – típusos fv. pointerek Események (Event) – delegátumok
![Page 11: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/11.jpg)
Krizsán Zoltán, iit C# osztályok 11
Tagfüggvény
Osztályban definiált függvény C#-ban nem definiálhatunk globális függvényt! Formája:
[attribútum] [módosítók] visszatérési_érték fvnév([paraméterszignatúra])
Egy módosító csak egyszer szerepelhet. Kölcsönösen kizárják egymást:
static, virtual, override Kölcsönösen kizárják egymást:
new, override
![Page 12: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/12.jpg)
Krizsán Zoltán, iit C# osztályok 12
Tagfüggvény változó hosszúságú paraméterlista
class OpenEnded{ public void Foo( params object[] pp ){
for (int i = 0 ; i < pp.GetLength(0) ; i++){ Console.WriteLine(pp[i]);
} }
} class TestVarArgs{
static void Main(string[] args){ OpenEnded oe = new OpenEnded(); oe.Foo( 123, 456, "Hello", new Point(7,8),
9.0m, true, 'X‘); }
}
![Page 13: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/13.jpg)
Krizsán Zoltán, iit C# osztályok 13
Tagfüggvényparaméter átadás módjai
void ertekSzerint(int a)beállított értéket kap
void referenciaSzerint(ref int a) hívásnál is kell a ref kulcsszó, kötelező
inicializálni void kimenetiRefSzerint(out int a)
hívásnál is kell az out kulcsszó, kötelező a fv. törzsben beállítani
![Page 14: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/14.jpg)
Krizsán Zoltán, iit C# osztályok 14
TagfüggvényMain fv. alakjai
public static void Main() {...}public static void Main(string[] args) {...}public static int Main() {...}public static int Main(string[] args) {...}
![Page 15: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/15.jpg)
Krizsán Zoltán, iit C# osztályok 15
TagfüggvényVirtuális fv.
Alapból nem virtuális (nem úgy, mint JAVA) virtual kulcsszó segítségével. Ha egy fv. virtuális, akkor kötelező definiálni a
törzsét Felülírása az override minősítővel a
leszármazott osztályok valamelyikében Teljes azonosság
![Page 16: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/16.jpg)
Krizsán Zoltán, iit C# osztályok 16
TagfüggvényKonstruktor
Neve: osztálynév Nem lehet meghívni explicite, de meghívódik
amikor a rendszer létrehozza az objektumot. Default konstruktor itt is van. Ha nincs konstruktor itt is létrejön egy, és ez
0, false, null-ra állít Hívható másik konstruktor, akár az
ősosztályé is, de a formája a következő:public Employee(int weeklySalary, int
numberOfWeeks) : this(weeklySalary) { }
![Page 17: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/17.jpg)
Krizsán Zoltán, iit C# osztályok 17
TagfüggvényDestruktor
Neve: ~osztálynév Csak 1 darab lehet. Ami finalize-re
konvertálódik. Nem öröklődik, és nem lehet felüldefiniálni. Nem lehet meghívni explicite, de meghívódik
amikor a gc felszabadítja, kisöpri az objektumot.
Nem lehet sem paramétere, sem módosítója.
![Page 18: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/18.jpg)
Krizsán Zoltán, iit C# osztályok 18
Külső fv.
Akkor mégis van??????????? Nem lehet definiálni, de lehet használni
mások által definiált dll fv.-eket.
[DllImport("kernel32", SetLastError=true)]
static extern bool CreateDirectory(string name,
SecurityAttribute sa);
![Page 19: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/19.jpg)
Krizsán Zoltán, iit C# osztályok 19
Operátorok
KétoperandusúEgyik legalább osztály típusú
EgyoperandusúOsztály típusú prefix postfix
![Page 20: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/20.jpg)
Krizsán Zoltán, iit C# osztályok 20
Szintaktikai szabályok
Statikus fv.-nek kell lennie (static)! Publikusnak kell lennie (public)! Neve kötelezően operator utána egy jel Egyoperandusú op.-nál a fv. paramétere kötelezően az adott
osztály típusú kell legyen! Kétoperandusú op.-nál a fv. egyik paramétere kötelezően az
adott osztály típusú kell legyen! Nem definiálható felül a [] operátor (de ott vannak az indexerek).
![Page 21: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/21.jpg)
Krizsán Zoltán, iit C# osztályok 21
Szintaktikai szabályok
() operatort nem lehet &&, || , ?: logikai operatorokat nem lehet == sem lehet, de az Equals fv.-t viszont felül
lehet írni! new, =, . Sem lehet <, > operátorokat csak párban lehet
újradefiniálni! Nem létező operátorokat nem lehet
újradefiniálni!
![Page 22: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/22.jpg)
Krizsán Zoltán, iit C# osztályok 22
Példa – egyoperandusú operátor
struct RGBColor{public static readonly RGBColor EMPTY = new RGBColor(0x00);public static readonly RGBColor FULL = new RGBColor(0xFF); int colorValue; public int ColorValue{ get { return colorValue; } } public RGBColor(int color){ colorValue = color; } public static RGBColor operator++(RGBColor color) {
if (color.colorValue != FULL) color.colorValue++; return color;
}public static RGBColor operator- -(RGBColor color) {
if (color.colorValue != EMPTY) color.colorValue--;return color;
}public string ToString(string format){
return (colorValue.ToString(format)); } }
![Page 23: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/23.jpg)
Krizsán Zoltán, iit C# osztályok 23
Példa – aritmetrikai operátor
public static bool operator<(RGBColor color1, RGBColor color2)
{
return color1.colorValue < color2.colorValue;
}
public static bool operator>(RGBColor color1, RGBColor color2)
{
return color1.colorValue > color2.colorValue;
}
![Page 24: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/24.jpg)
Krizsán Zoltán, iit C# osztályok 24
Példa – kétoperandusú operátor
public static RGBColor operator+(RGBColor color, int inc) {if (0xFF >= (color.colorValue + inc))
color.colorValue += inc; else
color.colorValue = 0xFF; return color;
} public static RGBColor operator-(RGBColor color, int dec)
{ if (0 < (color.colorValue - dec)) color.colorValue -= dec;
else color.colorValue = 0x00;
return color; }
![Page 25: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/25.jpg)
Krizsán Zoltán, iit C# osztályok 25
Példa
struct RGB{public RGB(RGBColor red, RGBColor green, RGBColor blue){
Red = red;Green = green;Blue = blue;
}public RGBColor Red;public RGBColor Green;public RGBColor Blue;public override string ToString(){
return (Red.ToString("X2") + Green.ToString("X2")+ Blue.ToString("X2"));
}}
![Page 26: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/26.jpg)
Krizsán Zoltán, iit C# osztályok 26
Példa – teszt osztály
class GradientFill{static void PrintRGBValue(RGB rgb) {
Console.WriteLine("{0} ", rgb);}public static void Main(){
Console.WriteLine("Getting RGB values for gradient " +"fill (dark red -> red)\n");
for (RGB rgb = RGB.DARKRED; rgb.Red.ColorValue < 0xFF; rgb.Red++ ){PrintRGBValue(rgb);
}}
}
![Page 27: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/27.jpg)
Krizsán Zoltán, iit C# osztályok 27
Konverziós operátorok
Alakja: public static kulcsszó operator mire(mit) Kulcsszó lehet:
ImplicitAutomatikusan lefut.Sikeresnek kell lennie!Akkor ajánlott, ha nem jár inf. veszteséggel
Explicit Nem fut le automatikusan.Hív(ód)ás:
(típus) kifejezés -> kivételt dobhat! Kif as típus -> Nem dobhat kivételt (null)!
![Page 28: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/28.jpg)
Krizsán Zoltán, iit C# osztályok 28
Példa II
public static implicit operator int (RGBColor col)
{
return col.colorValue;
}
Tesztben csere:
…
for (RGB rgb = RGB.DARKRED;
rgb.Red.ColorValue < RGBColor.FULL;
rgb.Red++){…}
…
![Page 29: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/29.jpg)
Krizsán Zoltán, iit C# osztályok 29
Példa - konverziós operátor
struct Celsius{ public Celsius(float temp){
this.temp = temp; } public static implicit operator Celsius(float temp){
Celsius c; c = new Celsius(temp); return(c);
} public static implicit operator float(Celsius c){
return((((c.temp - 32) / 9) * 5)); // Fahrenheit-be vissza } public float temp;
}
![Page 30: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/30.jpg)
Krizsán Zoltán, iit C# osztályok 30
Osztály részei
Adattagok (Field) - adatok Konstansok (Constant) – állandó adatok Csak olvasható mezők (read only)
Tagfüggvények (Method) – fv.-ek Operátorok (Operator) – speciális tfv.-ek Indexelők (Indexer) – speciális tfv.-ek
Tulajdonságok (Property) – kivűlről adat, belülről fv.
Delegátumok – típusos fv. pointerek Események (Event) – delegátumok
![Page 31: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/31.jpg)
Krizsán Zoltán, iit C# osztályok 31
Tulajdonságok
Kívülről adattag belülről tfv. Lehet csak írható, lehet csak olvasható Nem lehet fv. paramétere! Absztrakt osztály segítségével
kikényszeríthető a léte! Lehet virtuális.
![Page 32: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/32.jpg)
Krizsán Zoltán, iit C# osztályok 32
Szintaktika
[attributes] [modifers] <type> <property-name>
{
[ set {
<accessor-body>
} ]
[ get {
<accessor-body >
} ]
}
![Page 33: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/33.jpg)
Krizsán Zoltán, iit C# osztályok 33
Példa
class Address{protected string city; public string City{ get{ return city; } } //csak olvashatóprotected string zipCode; public string ZipCode{
get { return zipCode; } set { zipCode = value; city = "Atlanta";}
} } class PropertyApp{
public static void Main(){ Address addr = new Address(); addr.ZipCode = "30338"; string zip = addr.ZipCode;Console.WriteLine("The city for ZIP code {0} is {1}",
addr.ZipCode, addr.City); }
}
![Page 34: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/34.jpg)
Krizsán Zoltán, iit C# osztályok 34
Tulajdonságok IL-ben
![Page 35: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/35.jpg)
Krizsán Zoltán, iit C# osztályok 35
Példa - indexer
using System.Collections; class MyListBox{ protected ArrayList data = new ArrayList(); public object this[int idx] { get{ if (idx > -1 && idx < data.Count){ return (data[idx]); }else{ throw new InvalidOperationException("[MyListBox.set_Item]” +
"Index out of range"); }} set{
if (idx > -1 && idx < data.Count){ data[idx] = value; } else if (idx == data.Count){ data.Add(value); }else{
throw new InvalidOperationException( "[MyListBox.get_Item] Index out of range");
} }}}
![Page 36: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/36.jpg)
Krizsán Zoltán, iit C# osztályok 36
Példa – indexer teszt
class IndexersApp{
public static void Main(){
MyListBox lbx = new MyListBox();
lbx[0] = "foo";
lbx[1] = "bar";
lbx[2] = "baz";
Console.WriteLine("{0} {1} {2}", lbx[0], lbx[1], lbx[2]);
}
}
![Page 37: C# osztályok](https://reader035.fdocuments.net/reader035/viewer/2022062808/56815410550346895dc20f8a/html5/thumbnails/37.jpg)
Krizsán Zoltán, iit C# osztályok 37
Osztály részei
Adattagok (Field) - adatok Konstansok (Constant) - állandó adatok Csak olvasható mezők (read only)
Tagfüggvények (Method) - fv.-ek Operátorok (Operator) - speciális tfv.-ek Indexelők (Indexer) - speciális tfv.-ek
Tulajdonságok (Property) - kivülről adat, belülről fv. Delegátumok - típusos fv.pointerek (külön diasorozat) Események (Event) - delegátumok (külön diasorozat)