[PL] Klasy

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:

  1. public – klasy dostępne są w całym naszym projekcie oraz innych projektach, do ktorych dodamy referencje
  2. internal – klasa jest dostępna jedynie w ramach jednego projektu i nie widać jej poprzez referencje
    Klasy mogą być dodatkowo zadeklarowane jako:

  1. static
  2. abstract
  3. 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;
}
}
}
  • Łukasz

    “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

  • Arek Bal

    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.

  • neino

    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ą;)