[PL] Klasy

15 July 2013

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 class zabezpieczamy 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;
        }
    }
}