doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Rozdíl mezi COM a.net Distribuce komponent Programování založené na rozhraních Metody, vlastnosti Delegáty a události Příklad - čítač Komponenty GUI v.net 2 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 1
Rozdíl mezi COM a.net Neexistuje žádné bázové rozhraní jako IUnknown. Komponenty se vytvářejí přímo, ne přes class factory. Nepoužívají se čítače odkazů. Všechny informace o rozhraní jsou obsaženy ve zdrojovém programu, nepoužívá se IDL. Identifikace komponenty nevychází z GUID, ale z namespace a pro sdílené komponenty i z digitálního podpisu (strong name). 3 Distribuce komponent Základní jednotkou je assembly Jednodušší instalace pouhým kopírováním Jednotka verzování a zabezpečení Forma DLL nebo EXE Může obsahovat několik fyzických modulů Komponenty Další zdroje ikony, obrázky, řetězce Metadata + manifest Assembly Linker AL.exe 4 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 2
Komponenty ve Visual Studiu Vytvoření komponenty Projekt typu Class Library Použití komponenty Add Reference import definic typů a komponent z jiných knihoven (systémevých nebo vlastních) Hlavní program Windows Application s uživatelským rozhraním Console Application příkazový řádek 5 Komponenty ve Visual Studiu 6 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 3
Komponenty ve Visual Studiu 7 Programování založené na rozhraních Rozhraní = specifikace kontraktu Referenční typ Má pouze veřejné členy metody, vlastnosti, indexery, události Nemá implementaci, konstruktory a nelze vytvářet instance Třída = implementace kontraktu Může dědit pouze z jediné třídy Může implementovat více rozhraní Může navíc obsahovat proměnné, konstanty, 8 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 4
Rozhraní a typová bezpečnost Implicitní přetypování public interface IMyInterface { void Method1(); public class MyClass: IMyInterface { void Method1() { IMyInterface obj = (IMyInterface)new MyClass(); obj.method1(); 9 Metody a vlastnosti public interface IMyInterface { void Method1(); int SomeProperty{ get; set; public class MyClass: IMyInterface { public void Method1() { public int SomeProperty { get { set { 10 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 5
Delegát Objekt obalující referenci na konkrétní metodu delegate int BinaryOp(int x, int y); int add(int x, int y){ return x+y; BinaryOp Op = new BinaryOp(add); int z = Op(1, 2); 11 Delegát jako seznam Delegát lze použít také jako seznam referencí na metody public delegate void MyEvent(); MyEvent += new MyEvent(obj.Method1); MyEvent += new MyEvent(obj.Method2); Volání delegáta zajistí postupné provedení všech registrovaných metod MyEvent(); 12 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 6
Delegát jako událost public delegate void NumberChangedEvent(int val) Publisher = třída generující události class MyPublisher { public event NumberChangedEvent NumberChanged; public void FireEvent(int num) { NumberChanged(num); 13 Delegát jako událost Subscriber = třída reagující na událost public class MySubscriber { void OnNumberChanged(int num) { Console.WriteLine( num={0, num); MyPublisher publisher = new MyPublisher(); MySubscriber subscriber = new MySubscriber(); // registrace odběratele publisher.numberchanged += new NumberChangedEvent(subscriber.OnNumberChanged); 14 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 7
Konvence pro typ delegáta Delegát nevrací žádnou hodnotu Co by s ní měl publisher dělat? Objekt generující událost se předává jako první parametr Obslužná metoda může být společná pro více zdrojů Další parametry jsou zabaleny do třídy odvozené od EventArgs Možnost změn bez nutnosti zásahu do odběratelů 15 Konvence pro typ delegáta public delegate void EventHandler( object sender, EventArgs eventargs ) // zdroj události // parametry EventArgs.Empty - nejsou-li parametry public class MyEventArgs: EventArgs { Metody pro obsluhu událostí se pojmenovávají On<událost> 16 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 8
Příklad using System; namespace PTE { public class Counter { // událost překročení maximální hodnoty public event EventHandler LimitReached; public Counter(int limit) { this.limit = limit; 17 Příklad // hodnota čítače private int val; public int Value { get { return val; set { val = value; // maximální hodnota private int limit; public int Limit { get { return limit; set { limit = value; 18 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 9
Příklad // zvýšení čítače a ošetření přetečení public void increment() { val++; if( val >= limit ) { if( LimitReached!= null ) LimitReached(this, EventArgs.Empty); val = 0; 19 Komponenty GUI v.net namespace System.Windows.Forms komponenty pro lokální aplikace nahrazuje MFC (MS Foundation Classes) z C++ namespace System.Web.UI komponenty pro webové aplikace System.Web.UI.HtmlControls System.Web.UI.WebControls součást ASP.NET 20 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 10
21 Komponenty GUI v.net Windows.Forms.Label label1 = new Windows.Forms.Label(); label1.location = new Drawing.Point(24, 24); label1.name = "label1"; label1.size = new Drawing.Size(56, 24); label1.tabindex = 0; label1.text = "Login"; Controls.add(label1); 22 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 11