Jakie słowaOto mała tabelka podsumowująca jakie słowa kluczowe mogą być użyte w interfejsach, klasach i strukturach itp..
Kluczowe | Interfejs | Abstrakcyjna klasa | Klasa | Zamknięta Klasa | Struktura |
new | Tak@ | Tak | Tak | Tak | Nie@ |
private | Nie | Tak | Tak | Tak | Tak |
public | Nie | Tak | Tak | Tak | Tak |
protected | Nie | Tak | Tak | Tak | Nie@ |
virtual | Nie | Tak | Tak | Nie# | Tak |
override | Nie | Tak | Tak | Tak | Tak@ |
abstract | Nie | Wymagany | Nie | Nie# | Nie |
sealed | Nie | Nie | Nie | Wymagany | Nie |
Poniżej umieściłem objaśnienia co do pewnych nieścisłości w tabelce.
@Rzeczywiście w interfejsie można użyć słowa kluczowego new ,ale jest to szczególny przypadek.
Nie możemy tworzyć obiektów z interfejsów ,ale możemy użyć słowa kluczowego new, gdy chcemy przysłonić metodę. A metoda przesłoniona pochodzi oczywiście od jeszcze innego interfejsu.
interface ITest
{
void Metoda();
}
interface IJaMamSens : ITest
{
new void Metoda();
}
Jest to przypadek jeden na milion. Nie ma on nawet sensu.
@Struktura może używać słowa kluczowego new jednak nie tworzy ona w wtedy referencji jak klasa .W tym wypadku słowo kluczowe new wywołuje tylko konstruktor struktury. Struktura może być stworzona bez słowa kluczowego new, ponieważ jest ona typem wartościowy.
@Struktura jest domyślnie zamknięta “sealed” więc modyfikator dostępu protected nie może być użyty.
@ Struktura dziedziczy na poziomie frameworku po klasie System.Object, czyli metody takie jak “ToString()” mogą być nadpisane.
struct StrukturaTest
{
public override string ToString()
{
return "dsds";
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
# Zamknięta klasa nie może stać się klasą bazową więc słowa kluczowe virtual i abstract nie mają tutaj żadnego sensu.