Jason. Cała informatyka w jednym miejscu!

"sealed" w języku C#, oto kolejny temat niniejszej serii o "CSharpie". Jeśli głowicie się co to ma być i czy przypadkiem Was nie obrażam :D, zapraszam serdecznie do lektury. To nic strasznego ;)!

"SEALED" W JĘZYKU C# TRAKTUJ JAK "ZAPIECZĘTOWANIE"!

Pierwszym wnioskiem jaki trzeba wyciągnąć to to, że powyższe obce słowo kluczowe oznacza dosłownie "zapieczętowanie". OK, a tak po polsku :)? To zależy od kontekstu, bo te zapieczętowanie może dotyczyć klasy albo metody, albo właściwości!

ZAPIECZĘTOWANA KLASA

Gdy mamy na myśli klasę, to chodzi o ograniczenie dalszego dziedziczenia od klasy, która posiada modyfikator "sealed" w języku C#. Możecie mieć chętkę na zabronienie użytkownikowi dziedziczenia od jakiejś klasy, bo jest ona już tak szczegółowa, że bardziej szczegółowej już się zrobić nie da. Właśnie wtedy stosujemy zapieczętowanie, tak jak poniżej:

public sealed class MySealedClass
{
	
}

Co nam to da? Nałożenie "kłódki" na dziedziczenie od tej klasy przez inną klasę, która miałaby zostać potomną:

public class MyChildClass : MySealedClass
{
	
}

To spowoduje błąd kompilacji. Na tym się kończą modyfikacje spowodowane przez "sealed" w języku C# w kontekście klasy.

ZAPIECZĘTOWANA METODA

Drugie znaczenie odnosi się do zablokowania przesłonięcia metody. Kiedy w klasie potomnej chcielibyśmy zastosować przesłonięcie interesującego nas podprogramu, a on posiada modyfikator "sealed", pożegnamy się z kompilacją. Żeby ujrzeć efekt "nałożenia zakazu" przesłaniania, trzeba znowu zastosować parę słów kluczowych "virtual" (od strony klasy bazowej) i "protected" (od strony klasy potomnej). Spójrzcie:

KLASA "MYBASECLASS"
using System;

public class MyBaseClass
{
	public virtual void DoSomething()
	{
		Console.WriteLine("Wykonuję polecenia klasy bazowej.");
	}
}
KLASA "MYCHILDCLASS"
using System;

public class MyChildClass : MyBaseClass
{
	public sealed override void DoSomething()
	{
		Console.WriteLine("Wykonuję polecenia klasy potomnej i żadna inna klasa potomna nie będzie mogła ich zmienić!");
	}
}

Klasa potomna posiada przesłonięcie metody "DoSomething". Oprócz "otagowania" jej przesłoniętą, posiada dodatkowo nałożone "sealed" w języku C#, które od tej pory oznaczy przesłanianie jako zabronione. Efekt będzie taki, że każda następna klasa potomna dziedzicząca od "MyChildClass" nie będzie mogła nic zrobić z obecnym stanem rzeczy. Instrukcje zawarte w "DoSomething" będą utrwalone i nic już tego nie zmieni...

Nie da się uczynić metody zapieczętowanej kiedy jednocześnie oznaczamy ją "wirtualną" (zdolną do przesłonięcia)! Zapamiętajcie: "virtual" + "sealed" = błąd kompilacji! Jasne :)?

PONOWNIE KURS NA JAVĘ!

Jeżeli umiecie Javę do stopnia znajomości definiowania klasy oraz metody finalnej, to może przypomnę podobieństwo. Kojarzycie taki zapis ;)?

public final class MyBaseClass {
	public final void doSomething() {
		
	}	
}

"sealed" w języku C# daje ten sam efekt. Po prostu podmieniono słowa kluczowe i w języku Java macie do tych spraw "final", a tutaj stosujecie zapieczętowanie. A co do zmiennych, to w "CSharpie" macie do tego "const", ewentualnie "readonly". Nie można zastosować "sealed" dla danych składowych. Można za to zapieczętować właściwość :).

Słowo kluczowe "sealed" w języku C# jako klasa zapieczętowana

"sealed" w języku C# oznacza zapieczętowanie, czyli nałożenie blokady na dalsze dziedziczenie (w stosunku do klasy) oraz przesłanianie (w stosunku do metody i właściwości). Nie można zapieczętować pola (danej składowej)...

Słowo kluczowe "sealed" w języku C# jako metoda zapieczętowana

...ale właściwości już można!

Słowo kluczowe "sealed" w języku C# jako właściwość zapieczętowana

Koniec :P!

PODOBNE ARTYKUŁY