Programowanie obiektowe i zdarzeniowe wkład 2 klas i obiekt namespace ConsoleApplication1 // współrzędne punktu int, ; Jak zdefiniować w programie punkt? = 3; = 2; Może tak? // wpisanie informacji Console.WriteLine(" (0, 1)",, ); Console.ReadKe(); A co, jeśli punktów jest więcej? A co, jeśli punkt może mieć kolor, nazwę, znacznik widoczności, etc? Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/24
namespace ConsoleApplication1 // tworzenie punktu p1 = new (); Rozwiązanie: stworzenie klas reprezentującej punkt. p1. = 3; p1. = 2; Tworzenie obiektu klas. // wpisanie informacji Console.WriteLine(" (0, 1)", p1., p1.); Console.ReadKe(); class Definicja klas. Marek Tabędzki Programowanie obiektowe i zdarzeniowe 2/24
namespace ConsoleApplication1 // tworzenie punktu p1 = new (); p1. = 3; p1. = 2; // wpisanie informacji Console.WriteLine(" (0, 1)", p1., p1.); Console.ReadKe(); class p1 Ta instrukcja powołuje do żcia obiekt strukturę zawierającą dwie wartości tpu int (zgodnie z definicją). Marek Tabędzki Programowanie obiektowe i zdarzeniowe 3/24
namespace ConsoleApplication1 // tworzenie punktu p1 = new (); p1. = 3; p1. = 2; p1 Kropka pozwala odwołać się do składników (składowch) obiektu. 3 2 // wpisanie informacji Console.WriteLine(" (0, 1)", p1., p1.); Console.ReadKe(); class (3, 2) Marek Tabędzki Programowanie obiektowe i zdarzeniowe 4/24
// tworzenie punktów p1 = new (); p2 = new (); p1. = 3; p1. = 2; p2. = 5; p2. = 1; Na podstawie tej samej definicji klas możem stworzć wiele obiektów. p1 p2 3 2 5 1 // wpisanie informacji Console.WriteLine(" 1 (0, 1)", p1., p1.); Console.WriteLine(" 2 (0, 1)", p2., p2.); Console.ReadKe(); class (3, 2) (5, 1) Marek Tabędzki Programowanie obiektowe i zdarzeniowe 5/24
class // przesuń punkt o wektor [d, d] public void Przesuń(int d, int d) += d; p1 += d; p1 = new (); p1. = 3; p1. = 2; 3 2 Klasa to nie tlko struktura. Klas mogą mieć metod. p1 4 2 (3, 2) Console.WriteLine(" (0, 1)", p1., p1.); p1.przesuń(1, 0); Console.WriteLine(" (0, 1)", p1., p1.); (4, 2) Marek Tabędzki Programowanie obiektowe i zdarzeniowe 6/24
class // przesuń punkt o wektor [d, d] public void Przesuń(int d, int d) += d; += d; p1 = new (); p1. = 3; p1. = 2; p1 Jak to działa? 3 2 Console.WriteLine(" (0, 1)", p1., p1.); p1.przesuń(1, 0); Console.WriteLine(" (0, 1)", p1., p1.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 7/24
class // przesuń punkt o wektor [d, d] public void Przesuń(int d, int d) d 1 d 0 += d; += d; p1 = new (); p1. = 3; p1. = 2; this Jak to działa? 3 2 Console.WriteLine(" (0, 1)", p1., p1.); p1.przesuń(1, 0); Console.WriteLine(" (0, 1)", p1., p1.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 8/24
class // przesuń punkt o wektor [d, d] public void Przesuń(int d, int d) += d; += d; Można też zapisać: this. += d; this. += d; p1 = new (); p1. = 3; p1. = 2; d 1 d 0 this Jak to działa? 4 2 Console.WriteLine(" (0, 1)", p1., p1.); p1.przesuń(1, 0); Console.WriteLine(" (0, 1)", p1., p1.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 9/24
class // przesuń punkt o wektor [d, d] public void Przesuń(int d, int d) += d; += d; p1 = new (); p1. = 3; p1. = 2; p1 Jak to działa? 4 2 Console.WriteLine(" (0, 1)", p1., p1.); p1.przesuń(1, 0); Console.WriteLine(" (0, 1)", p1., p1.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 10/24
class public void Przesuń(int d, int d)... public () Console.WriteLine("to jest konstruktor"); p1 = new (); p2 = new (); p1. = 3; p1. = 2; p2. = 5; p2. = 1; Specjalnm tpem metod jest konstruktor. Console.WriteLine(" 1 (0, 1)", p1., p1.); Console.WriteLine(" 2 (0, 1)", p2., p2.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 11/24 p1 3 2 p2 to jest konstruktor to jest konstruktor 5 1
class public void Przesuń(int d, int d)... public (int, int ) this. = ; this. = ; p1 = new (3, 2); p2 = new (5, 1); Przeważnie zadaniem konstruktora jest inicjalizacja zmiennch. Można też zapisać w mniej niejednoznaczn sposób: public (int, int ) = ; = ; p1 3 2 p2 5 1 Console.WriteLine(" 1 (0, 1)", p1., p1.); Console.WriteLine(" 2 (0, 1)", p2., p2.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 12/24
class public void Przesuń(int d, int d)... public (int, int ) this. = ; this. = ; p1 = new (3, 2); p2 = new (5, 1); 3 2 this Przeważnie zadaniem konstruktora jest inicjalizacja zmiennch. Console.WriteLine(" 1 (0, 1)", p1., p1.); Console.WriteLine(" 2 (0, 1)", p2., p2.); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 13/24
class Ciekawostka: konstruktor domśln.... main... p = new (); class public (int, int ) this. = ; this. = ;... main... p = new (); Dlaczego przestało to działać? Marek Tabędzki Programowanie obiektowe i zdarzeniowe 14/24
class public void Przesuń(int d, int d)... public (int, int )... public override string ToString() return "jak to działa?"; p1 = new (3, 2); Console.WriteLine(" 0", p1); Specjalna metoda: ToString(). jak to działa? Można to też zapisać: Console.WriteLine(" 0", p1.tostring()); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 15/24
class tekstowej reprezentacji public void Przesuń(int d, int d)... public (int, int )... obiektu. public override string ToString() return "(" + + ", " + + ")"; p1 = new (3, 2); Console.WriteLine(" 0", p1); Zadaniem metod ToString() jest zwrócenie (3, 2) Marek Tabędzki Programowanie obiektowe i zdarzeniowe 16/24
class private int, ; public void Przesuń(int d, int d) += d; += d; public (int, int ) = ; = ; public override string ToString() return "(" + + ", " + + ")"; p1 = new (3, 2); p1.przesuń(1, 0); Console.WriteLine(p1); Pojęcie hermetzacji. To, co jest istotne dla użtkownika klas, nosi nazwę interfejsu. Jest to funkcjonalność, z jakiej można skorzstać. Powinien bć publiczn i nie powinien się zbt często zmieniać. Marek Tabędzki Programowanie obiektowe i zdarzeniowe 17/24
class private int, ; public void Przesuń(int d, int d) += d; += d; public (int, int ) = ; = ; public override string ToString() return "(" + + ", " + + ")"; p1 = new (3, 2); p1.przesuń(1, 0); Console.WriteLine(p1); Pojęcie hermetzacji. Implementacja nie jest ważna dla użtkownika klas. Jest prwatną sprawą twórc klas i może zmieniać się bez ostrzeżenia. To ona sprawia, że interfejs działa. Marek Tabędzki Programowanie obiektowe i zdarzeniowe 18/24
Przkład: Konto. Marek Tabędzki Programowanie obiektowe i zdarzeniowe 19/24
<Window... Title="Konto" SizeToContent="Height" Width="350"> <Grid Margin="2"> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/> <ColumnDefinition/> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="auto"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <Label Margin="2">Saldo:</Label> <TetBo Name="ttSaldo" IsReadOnl="True" Grid.Column="1" Grid.ColumnSpan="3" Margin="2">0</TetBo> <Label Grid.Row="1" Grid.ColumnSpan="4" Margin="2">Operacje:</Label> <TetBo Name="ttKwota" Grid.Row="2" Grid.ColumnSpan="2" Margin="2"/> <Button Grid.Row="2" Grid.Column="2" Margin="2" Padding="10,3" Click="ClickWplac">Wpłać</Button> <Button Grid.Row="2" Grid.Column="3" Margin="2" Padding="10,3" Click="ClickWplac">Wpłać</Button> </Grid> </Window> Marek Tabędzki Programowanie obiektowe i zdarzeniowe 20/24
public partial class Window1 : Window Konto konto = new Konto(); private void ClickWplac(...) double kwota = double.parse(ttkwota.tet); konto.wpłać(kwota); ttsaldo.tet = konto.saldo().tostring(); private void ClickWplac(...) double kwota = double.parse(ttkwota.tet); konto.wpłać(kwota); ttsaldo.tet = konto.saldo().tostring(); class Konto Klasa Konto.... public void Wpłać(double kwota)... public void Wpłać(double kwota)... public double Saldo()... Marek Tabędzki Programowanie obiektowe i zdarzeniowe 21/24
class Konto private double suma; public void Wpłać(double kwota) suma += kwota; public void Wpłać(double kwota) suma -= kwota; public double Saldo() return suma; Klasa Konto. Marek Tabędzki Programowanie obiektowe i zdarzeniowe 22/24
class Konto private double suma; public void Wpłać(double kwota) suma += kwota; public void Wpłać(double kwota) if (kwota <= 0 kwota > suma) MessageBo.Show("Nie możesz wpłacić."); return; suma -= kwota; public double Saldo() return suma; Jaką to: Konto.Wpłać(250); ma przewagę nad tm? Konto.suma -= 250; Marek Tabędzki Programowanie obiektowe i zdarzeniowe 23/24
public partial class Window1 : Window public Window1() InitializeComponent(); Konto konto = new Konto(); Dodatki Cz wprowadzono liczbę? private void ClickWplac(object sender, RoutedEventArgs e) double kwota; if (double.trparse(ttkwota.tet, out kwota)) konto.wpłać(kwota); ttsaldo.tet = konto.saldo().tostring("f2"); ttkwota.tet = ""; ttkwota.focus(); private void ClickWplac(...)... Formatowanie: 2 miejsca po przecinku Przenoszenie kursora Marek Tabędzki Programowanie obiektowe i zdarzeniowe 24/24