
Klasa jest typu referencyjnego i pozwala na przechowanietaich typów jak: konstruktory, destruktory, stałe, pola, metody, właściwości, indeksatory, operatory, zdarzenia, obiekty delegowane, klasy, interfejsy, struktury.
Definicję klasy zapisujemy za pomocą słowa kluczowego class:
class Program
{
}
- Klasy posiadają dwa rodzaje modyfikatorów dostępu:
- public – klasy dostępne są w całym naszym projekcie oraz innych projektach, do ktorych dodamy referencje
- internal – klasa jest dostępna jedynie w ramach jednego projektu i nie widać jej poprzez referencje
- Klasy mogą być dodatkowo zadeklarowane jako:
- static
- abstract
- sealed
Oznacza to, że możemy dodać ograniczenia do naszych klas, czyli:
Poprzez deklarację static class:
• Nie możemy dziedziczyć po tej klasie
static class Slonce
{
}
class Ksiezyc : Slonce
{
}
Error: 'ConsoleApplication.Ksiezyc': cannot derive from static class 'ConsoleApplication.Slonce'
• Możemy używać tylko statycznych metod
static class Slonce
{
void Wschod();
}
Error: 'Wschod': cannot declare instance members in a static class
• Nie możemy tworzyć nowej instancji w tej klasie
static class Slonce
{
Ksiezyc ksiezyc = new Ksiezyc();
}
class Ksiezyc
{
}
Error: 'ConsoleApplication1.Slonce.ksiezyc': cannot declare instance members in a static class
Poprzez deklarację abstract class: • Klasa abstrakcyjna domyślnie jest publiczna, jednak może być jedynie internal.
private abstract class Slonce
{
}
Error: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal
• W klasie dziedziczącej po klasie abstrakcyjnej nalezy podać wszytsie metody, które znajduja się w klasie abstrakcyjnej
public abstract class Slonce
{
public abstract void Wschod();
public abstract void Zachod();
public abstract void Poludnie();
}
class Ksiezyc : Slonce
{
public override void Wschod()
{
}
public override void Zachod()
{
}
}
Error: 'ConsoleApplication1.Ksiezyc' does not implement inherited abstract member 'ConsoleApplication.Slonce.Poludnie()'
• Metoda z klasy dziedziczącej po klasie abstrakcyjnej musi mieć takie same modyfikatory dostępu jak metody w kalsie abstrakcyjnej.
abstract class Slonce
{
public abstract void Wschod();
internal abstract void Zachod();
}
class Ksiezyc : Slonce
{
public override void Wschod()
{
}
public override void Zachod()
{
}
}
Error: 'ConsoleApplication1.Ksiezyc.Zachod()': cannot change access modifiers when overriding 'internal' inherited member 'ConsoleApplication.Slonce.Zachod()'
Poprzez deklarację sealed classzabezpieczamy się przed dziedziczeniem naszej kalsy przez inne.
sealed class Slonce
{
}
class Ksiezyc : Slonce
{
}
Error: 'ConsoleApplication.Ksiezyc': cannot derive from sealed type 'ConsoleApplication.Slonce'
Dodatkowo w naszym projekcie możemy użyć partial class, które dzieli nam naszą klasę na dwie lub więcej części. Każda z części zawierać może swoją logikę, a łączona jest ona w całość podczas kompilacji, np:
class Program
{
static void Main()
{
Slonce slonce = new Slonce();
Console.WriteLine(slonce.Wschod());
Console.WriteLine(slonce.Zachod());
Console.ReadLine();
}
}
partial class Slonce
{
public string Wschod (string wschod = "4:44")
{
return wschod;
}
}
partial class Slonce
{
public string Zachod (string zachod = "22:22")
{
return zachod;
}
}
}
“Klasa jest typu referencyjnego i pozwala na przechowanietaich typów jak: konstruktory, destruktory, stałe, pola, metody, właściwości, indeksatory, operatory, zdarzenia, obiekty delegowane, klasy, interfejsy, struktury.”
to nie są typy
W statycznych klasach…Możemy używać tylko statycznych metod…
Można mieć też statyczne zmienne i właściwości, deklaracje klas zagnieżdżone, deklaracje delegatów…
Klasa zagnieżdżona wogóle może też zostać oznaczona także modyfikatorami private, protected.
“W klasie dziedziczącej po klasie abstrakcyjnej należy podać wszystkie metody, które znajduja się w klasie abstrakcyjnej”
Przewaga klas abstrakcyjnych nad interfejsami jest taka, że klasy abstrakcyjne mogą posiadać część definicji metod, właściwości itd. Tylko metody i właściwości abstrakcyjne muszą zostać przeciążone.
Fajny post, ja odniosę się tylko do:
“W klasie dziedziczącej po klasie abstrakcyjnej należy podać wszystkie metody, które znajduja się w klasie abstrakcyjnej”
tutaj oczywiście jest wyjątek!
można podziedziczyć po klasie abstrakcyjnej i utworzyć inną klasę abstrakcyjną;)