Klasa w języku C#
Definicja klasy
Klasa to złożony typ danych, który zawiera w sobie- typy stałe
- właściwości (typy zmienne klasy)
- metody (funkcje klasy)
Konstruktor klasy
Konstruktor klasy to metoda wywoływana jako pierwsza przy tworzeniu obiektu. Konstruktor ma taką samą nazwę jak nazwa klasy. Konstruktor nie zwraca żadnych wartości. Jeżeli w ciele klasy nie zdefiniowano konstruktora to podczas tworzenia obiektu danej klasy wywoływany jest konstruktor domyślny. Konstruktor zdefiniowany może posiadać argumenty. Podczas tworzenia obiektu konstruktor wywoływany jest słowem kluczowym new.
Przykład ciała konstruktora klasy Figura
Wskazówka:
//konstruktor
Figura(int ileOdcinkow)
{
odcinek = new List<float>();
IleOdcinkow= ileOdcinkow;
}
W tym przykładzie konstruktor ma jeden argument, który określa z ilu odcinków ma składać się figura
Destruktor klasy
Destruktory klasy są wywoływane automatycznie przy zakończeniu odwołań do obiektu utworzonego z danej klasy. Istnieją takie sytuacje, w których musimy sami po obiekcie posprzątać (zwolnic pamięć). Najczęściej są to sytuacje z wykorzystaniem wskaźników, tworzeniem buforów graficznych itp. Destruktor definiuje się od znaku tyldy (~) używając nazwy klasy, której destruktor dotyczy
Wskazówka:
//destruktor
~Figura()
{
odcinek.Clear();
odcinek = null;
}
Dodawanie klasy w kompilatorze Visual Studio
W praktyce programowania przyjęte jest, że klasy tworzy się w osobnych plikach, wtedy nazwa pliku jest jednakowa z nazwą klasy. Nazwy klasy przyjęto definiować z dużej litery.
Aby dodać klasę wybierz menu Projekt/Dodaj klasę?
W oknie dialogowym Dodaj nowy element wybierz jak poniżej
Jeżeli wszystko zostało wykonane prawidłowo to w zakładce Eksplorator rozwiązań pojawi się plik o nazwie utworzonej klasy, a w Oknie definicji kodu pojawi się nowa zakładka z zalążkiem kodu nowo utworzonej klasy
Jak interpretować poniższy zalążek definicji utworzonej klasy?
Wskazówka:
namespace WlasciwosciBryl
{
internal class Bryla
{
}
}
Słowo kluczowe namespace oznacza, że tworzona klasa będzie zdefiniowana w zakresie powiązanych obiektów przestrzenią nazw (w tym przykładzie przestrzenia projektu o nazwie WlasciwosciBryl)
Słowo kluczowe internal jest modyfikatorem dostępu pozwalającym na dostęp za pomocą dowolnego kodu w tym samy zestawie kompilacji (w tej samej przestrzeni nazw)
Przykładowa aplikacja Właściwości figur
Cel: Napisz aplikację wykorzystującą klasę dotyczącą podstawowych właściwości figur. Na tym etapie rozwiązania opracuj metodę tworzenia obiektu klasy Figura z możliwością losowego przypisania długości boków.
Utwórz formatkę
Proponowany układ kontrolek
Utwórz klasę Figura
Zadaniem klasy Figura jest utworzenie listy odcinków tworzących przyszłą figurę. Można przyjąć, że jeden odcinek to okrąg, trzy odcinki to trójkąt itd. Na tym etapie rozwiązania klasa powinna zawierać:
- ilość boków
- listę długości boków
- konstruktor tworzący listę boków
- destruktor usuwający listę boków
- dostęp do odcinków
- ustawienie długości wybranego odcinka
- losowe ustawienie długości odcinka
Klasa Figura ma za zadanie być klasa bazową do przyszłych klas związanych z konkretnymi figurami (okrąg, trójkąt, kwadrat, prostokąt itp.)
Dodaj do projektu klasę Figura. Plik Figura.cs wypełnij poniższym kodem
Wskazówka:
namespace WlasciwosciFigur
{
internal class Figura
{
private int n;//ilość odcinków
//okrąg ma jeden i jest to promien,
//trojkat ma trzy i są to boki itd.
private List<float> odcinek;
//dostęp do właściwości
public int IleOdcinkow
{
set{n= value;//ustaw ile docinków ma figura
odcinek.Clear();//czyśc liste odcinków
//ustaw długosci odcinko na zero
for (int i = 0; i < n; i++) odcinek.Add(0);
}
get{ return n;}//zwróć ilość odcinków
}
public List<float> Odcinek
{
get { return odcinek;}
}
//konstruktor
public Figura(int ileOdcinkow)
{
odcinek = new List<float>();
IleOdcinkow= ileOdcinkow;
}
//destruktor
~Figura()
{
odcinek.Clear();
odcinek = null;
}
//metody
public void UstawDlugosc(int i,float dlugosc)
{
if (i < odcinek.Count)
odcinek[i] = dlugosc;
else MessageBox.Show(
"Figura nie ma takiej ilości odcinków",
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
//ustaw losowe dlugosci boków
public void UstawLosoweDlugosciBokow()
{
Random los=new Random();
for (int i = 0; i < n; i++)
UstawDlugosc(i, (float)los.NextDouble()*100+1);
}
}
}
Utwórz obiekt klasy Figura
W głównej klasie projektu zadeklaruj zmienną klasy Figura
Wskazówka:
public partial class Form1 : Form
{
private Figura figura;
public Form1()
{
InitializeComponent();
}
W zdarzeniu Click kontrolki Button powołaj do życia zadeklarowany obiekt (figura). W konstruktorze obiektu podaj ilość boków odczytaną z kontrolki TextBox. Wylosuj losowe długości boków posługując się metodą zdefiniowana w klasie Figura. Patrz poniższy kod
Wskazówka:
private void button1_Click(object sender, EventArgs e)
{
//usuń poprzednie wystąpienie obiektu
if(figura!= null){ figura = null; }
int n=Convert.ToInt32(textBox1.Text);
figura = new Figura(n);
figura.UstawLosoweDlugosciBokow();
}
Na ekranie w kontrolce TextBox pracującej w układzie Multiline pokaż wylosowane długości boków
Wskazówka:
private void button2_Click(object sender, EventArgs e)
{
if (figura == null || figura.IleOdcinkow < 1)
{
MessageBox.Show(
"Figura nie została utworzona",
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
return;
}
textBox2.Clear();
foreach(float o in figura.Odcinek)
textBox2.AppendText(o.ToString("F2")+Environment.NewLine);
}
Skompiluj program i sprawdź efekt działania
Pełny kod pliku Form1.cs
Wskazówka:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WlasciwosciFigur
{
public partial class Form1 : Form
{
private Figura figura;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//usuń poprzednie wystąpienie klasy
if(figura!= null){ figura = null; }
int n=Convert.ToInt32(textBox1.Text);
figura = new Figura(n);
figura.UstawLosoweDlugosciBokow();
}
private void button2_Click(object sender, EventArgs e)
{
if (figura == null || figura.IleOdcinkow < 1)
{
MessageBox.Show(
"Figura nie została utworzona",
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
return;
}
textBox2.Clear();
foreach(float o in figura.Odcinek)
textBox2.AppendText(o.ToString("F2")+Environment.NewLine);
}
}
}
Pełny kod pliku Figura.cs
Wskazówka:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WlasciwosciFigur
{
internal class Figura
{
private int n;//ilość odcinków
//okrąg ma jeden i jest to promien,
//trojkat ma trzy i są to boki itd.
private List<float> odcinek;
//dostęp do właściwości
public int IleOdcinkow
{
set{n= value;//ustaw ile docinków ma figura
odcinek.Clear();//czyśc liste odcinków
//ustaw długosci odcinko na zero
for (int i = 0; i < n; i++) odcinek.Add(0);
}
get{ return n;}//zwróć ilość odcinków
}
public List<float> Odcinek
{
get { return odcinek;}
}
//konstruktor
public Figura(int ileOdcinkow)
{
odcinek = new List<float>();
IleOdcinkow= ileOdcinkow;
}
//destruktor
~Figura()
{
odcinek.Clear();
odcinek = null;
}
//metody
public void UstawDlugosc(int i,float dlugosc)
{
if (i < odcinek.Count)
odcinek[i] = dlugosc;
else MessageBox.Show(
"Figura nie ma takiej ilości odcinków",
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
//ustaw losowe dlugosci boków
public void UstawLosoweDlugosciBokow()
{
Random los=new Random();
for (int i = 0; i < n; i++)
UstawDlugosc(i, (float)los.NextDouble()*100+1);
}
}
}