280 likes | 424 Views
wykład 1. PSZ Programowanie w Środowiskach Zintegrowanych > Systemy i środowiska zintegrowane > Środowisko zintegrowane Visual Studio .NET. w wykładzie wykorzystano dostępne publicznie materiały firmy Microsoft, pochodzące z prezentacji „ .NET Framework & C#”. Konspekt bieżącego wykładu.
E N D
wykład 1 PSZ Programowanie w Środowiskach Zintegrowanych > Systemy i środowiska zintegrowane > Środowisko zintegrowane Visual Studio .NET
w wykładzie wykorzystano dostępne publicznie materiały firmy Microsoft, pochodzące z prezentacji „.NET Framework & C#”
Konspekt bieżącego wykładu • Kompilacja z linii poleceń a VS.NET • Model obiektowy wg. CLR • hermetyzacja, enkapsulacja, polimorfizm, dziedziczenie
VB C++ C# JScript J# Visual Studio.NET Common Language Specification ASP.NET Web Forms Web Services Mobile Internet Toolkit Windows Forms ADO.NET and XML Base Class Library Common Language Runtime Operating System Visual Studio .NET
Czy VS.NET jest wymagane do tworzenia oprogramowania? • Odpowiedź brzmi: nie !!! • Jesteśmy w stanie tworzyć programy korzystając z linii poleceń • Kompilator języka c# dostarczany jest wraz z platformą .NET, którą można ściągnąć z Internetu albo przez Windows Update • Kolejne wersje platformy .NET znajdują się w katalogu • C:\[Windows]\Microsoft.NET\Framework\v[xxxxxxxxx] • Należy pamiętać o dodaniu odpowiednich ścieżek do zmiennej path • Kompilator nosi nazwę csc i można go uruchamiać z linii poleceń • Disasembler nosi nazwę ildasm, i można go znaleźć w menu .NET SDK/tools • Spróbujmy uruchomić następujący przykład
VS.NET przykład HelloWorld w C# class MyClass { static void Main(string[] args) { System.Console.WriteLine("Hello world"); } }
Rezultaty kompilacji • W wyniku kompilacji powstaje plik .exe lub .dll • Pliki te nie są prawdziwymi plikami .exe i .dll znanymi z systemu windows lecz tzw. lokalny podzespół (ang. assembly). Podzespoły te noszą nazwę logicznych.exe i .dll, i mogą zawierać nie tylko programy, ale również wszelkie inne typy zasobów (obrazy, pliki, html itp.) • Każdy podzespół zawiera tzw. manifest, określający jego nazwę, numer wersji, spis składowych wewnętrznych i wykaz innych podzespołów od jakich podzespół zależy • Informacje o manifeście można przejrzeć dokonująć disasemblacji podzespołu. Disasembler dostępny jest z menu tools pakietu .NET Framework
Środowisko VS.NET • W takim razie po co nam VS.NET • Intelisense (podpowiedzi w czasie pisania) • Dynamiczna weryfikacja składni • Wygodne paski narzędziowe • Inspektor obiektów • Okno drzewa obiektów, przeglądarka klas • Edytor kodu i diagramów • Generator podpowiedzi i skrótów • Menedżer projektów • Zintegrowany lokalny i zdalny debugger • Ułatwienia w wykorzystaniu bibliotek komponentów • Komponenty dostępne na „rynku komponentów”
W takim razie po co nam VS.NET • Spróbujmy ten sam przykład wygenerować przy pomocy VS.NET
VS.NET typy projektów Szablony projektów Języki programowania Aplikacje typu SETUP Bazy danych i rozszerzenia IDE Inne rozwiązania wybór projektu i szablonu determinuje jakie pliki zostaną automatycznie dopięte do projektu i jakimi komponentami będziemy dysponować
Elementy środowiska VS.NET Pasek Menu Projekt Komponenty Właściwości Klasy Pomoc Serwery Zakładki z plikami źródłowymi Komunikaty, błędy, ostrzeżenia
VS.NET przykład HelloWorld w C# W oknie projektu (Solution Explorer) widzimy nazwy plików składających się na pakiet, informacje o metadanych, definicję ikony oraz drzewo zależności które potrzebne są do prawidłowego działania modułu W widoku klas (Class View) widzimy informacje o przestrzeni nazw, klasach, polach metodach i klasach bazowych klas; ikony oznaczają typ dostępu Po kliknięciu prawym klawiszem myszy i wybraniu „Properties” widzimy cechy obiektu bądź – jak w tym przypadku – klasy; można je dynamicznie zmieniać
Model obiektowy wg. CLR • Obiekt: • definicje są bardzo różne: np. • coś, czemu można nadać nazwę, np. samochód, tablica, przycisk na formularzu • reprezentacja rzeczy istniejącej w rzeczywistości • wg. CLR obiekt pewna całość, której można przypisać dwie cechy: • dynamiczne - określające zachowanie • statyczne – określające stan • wg. CLR obiekty można podzielić na trzy kategorie, w zależności od tego co jest cechą dominującą: • jeśli najważniejszy jest stan, obiekt nosi nazwę obiektu wartościowego (value object); przykłady: data, łańcuch, napis, wartośc w walucie • jeśli najważniejsze są usługi, a stan jest nieistotny obiekt ma charakter usługowy (service object), przykłady: kontroler, weryfikator numeru karty, manager komunikacji itp. • jeśli obydwie cechy są ważne, tzn. ważna jest tożsamość obiektu, obiekt nosi nazwę obiektu rzeczywistego (entity object); obiekty tej klasy często zapisywane są w bazie danych, przykłady: konto bankowe, osoba itp
Model obiektowy wg. CLR • Zróżnicowanie typów obiektów jest dobrze widoczne np. operacjach kopiowania (klonowania) : • obiekty wartościowe mogą być kopiowane przez kopiowanie wszystkich pól (shallow copy), ponieważ tożsamość nie ma tutaj znaczenia; jeśli obiekt wchodzi w związki z innymi obiektami wystarczy skopiować referencje do tych obiektów i będzie OK. (shallow copy) • obiekty usługowe raczej nie powinny być kopiowane • obiekty rzeczywiste posiadają tożsamość i powinny być kopiowane rozważnie, poprzez rozważne utworzenie całej wewnętrznej infrastruktury obiektu, tj. wszystkich pól będących obiektami wartościowymi (tu proste kopiowanie), i ewentualne odtworzenie obiektów z którymi dany obiekt wchodzi w związki; (deep copy)
Model obiektowy wg. CLR • Klasa składa się z: • metod – realizujących aktywność klasy; metoda ma nazwę, może mieć argumenty i typ wyniku • pól – przechowujących informacje o stanie obiektu, które mogą być referencjami do innych obiektów lub zmiennymi typów bezpośrednich • właściwości – które są specyficznymi polami, do których zaimplementowano metody akcesyjne (akcesory) • zdarzeń – subskrypcja zdarzeń, na które obiekt ma reagować, zgodnie ze wzorcem observer
Model obiektowy wg. CLR • Typy pól (argumentów) • typy bezpośrednie (value types) • pochodne od System.ValueType, przekazywane przez wartość, przechowywane na stosie, dobrze znane int, string, float itp. • podlegają w razie potrzeby podlegają opakowywaniu / rozpakowaniu • int n=3; • object k = test(n); gdzie test jest typu void test(object o) // opakowanie • int z = (int) k; // rozpakowanie • typy referencyjne (reference type) • obiekty zdefiniowanych klas, przekazywane wyłącznie przez referencję, przechowywane na stercie, domyślnie dziedziczą z klasy object
Model obiektowy wg. CLR • Enkapsulacja • ograniczenie dostępu do pewnych fragmentów klasy • modyfikatory private, protected, public, internal class Figura { protected int x, y, bok; protected Pen skyBluePen = new Pen(Brushes.DeepSkyBlue); public void Rysuj(Graphics g){} public void Przesun(int Adx, int Ady) { x+=Adx; y+=Ady; } }
Model obiektowy wg. CLR • Dziedziczenie • wyłącznie jednobazowe • dziedziczenie wielobazowe (z C++) realizowane przy pomocy interfejsów class Kwadrat : Figura { public Kwadrat(int Ax, int Ay, int Abok) { x = Ax; y = Ay; bok = Abok; } new public void Rysuj(Graphics g) { g.DrawRectangle(skyBluePen, x, y, bok, bok); } }
Model obiektowy wg. CLR • Polimorfizm • w programowaniu obiektowym to wykazywanie przez metodę różnych form działania w zależności od tego jaki typ obiektu jest wskazywany przez wskaźnik lub referencję (pomijając typ wskaźnika lub referencji • w programowaniu funkcyjnym to możliwość stosowania tej samej funkcji dla różnych typów parametrów. Najprostsza funkcja polimorficzna abstract class Figura { … public virtual void Rysuj(Graphics g){} … } class Kwadrat : Figura { … override public void Rysuj(Graphics g) { g.DrawRectangle(skyBluePen, x, y, bok, bok); } … }
Model obiektowy wg. CLR • Interfejs reprezentuje zachowanie, najczęściej wspólne dla wielu obiektów, któremu można nadać nazwę, np. „drukowalny”, „zapisywalny do strumienia”, „transportowy” • Interfejsy zapewniają możliwość zaimplementowania pewnych zachowań, które niejako stoją obok głównej, „organicznej”, ścieżki dziedziczenia • Przykład: „TIR” jest pojazdem, „Samochód” też jest pojazdem, posiadają wspólne cechy (dziedziczenie). „TIR” jednakże posiada zdolność do przewożenia ładunków, których „Samochód” przewieźć nie może. Aby pokreślić zdolność do przewożenia ładunków, możemy zaimplementować w klasie TIR interfejs ITransport, który dodaje obiektom klasy zdolność przewożenia ładunku. Interfejs ITransport powinien także zostać zaimplementowany w klasach „Pociąg”, „Samolot” itp. W przyszłości, jeśli pojawi się transportowy wodolot, również powinien otrzymać interfejs „ITransport” • Przykład: większość klas z kolekcjami ma zaimplementowany interfejs ILIST, które dają tę możliwość, iż obiekty tego typu można po prostu traktować jako listy
Model obiektowy wg. CLR • Interfejsy – przykład interface IDrawable { void Rysuj(Graphics g); } abstract class Figura: IDrawable { protected int x, y, bok; protected Pen skyBluePen = new Pen(Brushes.DeepSkyBlue); public virtualvoid Rysuj(Graphics g){} public void Przesun(int Adx, int Ady) { x+=Adx; y+=Ady; } } • sprawdzenie implementacji interfejsu: if (kwadrat is IDrawable)
Model obiektowy wg. CLR • Przeciążanie – wiele metod o tych samych nazwach, lecz różnych typach argumentów • Przesłanianie: • modyfikatory dla metod • Overridable (virtual) - może, lecz nie musi być przesłonięta w klasie pochodnej • MustOverride (new) – wymaga przesłonięcia w klasie pochodnej • NotOverridable (override) – nie może być przesłaniania w klasach pochodnych
Model obiektowy wg. CLR • Właściwość to pole prywatne, do którego zaimplementowano akcesory • niech k będzie obiektem klasy „Słupek”. Zamiast wywoływać g=k.GetBar() lub k.SetBar(15) możemy po prostu wywołać odpowiednio g=k.Bar i k.Bar = 15; • właściwości dają tę zaletę nad publicznymi polami, że ich modyfikacja zawsze wymaga przejścia przez metody get / set, co ułatwia nam kontrolę nad przypisywaniem wartości polom przykład: c++ class Słupek { int bar; public int GetBar() { return bar; } public void SetBar(int newbar) { // check newbar for validity bar = newbar; } } przykład: c# class Słupek { int bar; public int Bar { get { return bar; } set { // check the new value bar = value; } } }
Model obiektowy wg. CLR • Model zdarzeniowy/callback • this.button1.Click += new System.EventHandler(this.button1_Click); • obsługa przez tzw. delegację Elementy interfejsu … informują obiekt klasy EdytorForm o wystąpieniu zdarzenia
Model obiektowy wg. CLR • Delegacja – odpowiada niejako liście wskaźników do statycznych funkcji delegate void D(int x); // odpowiada typedef class C { public static void M1(int i) {...} public static void M2(int i) {...} } class Test { static void Main() { D cd1 = new D(C.M1); // M1 D cd2 = new D(C.M2); // M2 D cd3 = cd1 + cd2; // M1 + M2 D cd4 = cd3 + cd1; // M1 + M2 + M1 D cd5 = cd4 + cd3; // M1 + M2 + M1 + M1 + M2 } }
Model obiektowy wg. CLR public delegate void ButtonEventHandler(); class TestButton { // OnClick is an event, implemented by a delegate ButtonEventHandler. public event ButtonEventHandler OnClick; // A method that triggers the event: public void Click() { OnClick(); } } //Create an instance of the TestButton class. TestButton mb = new TestButton(); // Specify the method that will be triggered by the OnClick event. mb.OnClick += new ButtonEventHandler(TestHandler); // Specify an additional anonymous method. mb.OnClick += delegate { System.Console.WriteLine("Hello, World!"); }; // Trigger the event mb.Click();
Na wykładzie • Wprowadzenie do programowania obiektowego w C# • Założenie i motywacja • Składowe klas • Dziedziczenie, interfejsy • Środowisko Visual Studio IDE • Proste projekty w linii poleceń • Wykorzystanie VS.NET • Na następnym wykładzie: Biblioteka system (kolekcje)