Определяются соответственно ключевыми словами class, struct и interface.
class NameOfClass
{
// members and methods of class
}
interface NameOfInterface
{
// methods of interface
}
struct NameOfStruct
{
// members of struct
}
Есть ключевое слово public, которое можно поставить перед определением класса, интерфейса или структуры. Если public написано, то можно будет использовать их из других пространств имен, а если слово public не написано, то объявления будут видны только в своем пространстве имен.
Принцип наследования отностится только к классам объектов. Наследование означает, что каждый класс может иметь наследников, каждый из которых будет обладать всеми полями и методами своего предка. Кроме того, классы-наследники совместимы по типу со своими предками.
Наследование бывает двух видов:
В C# есть только одиночное наследование (и только public для тех, кто знает C++).
class Base
{
}
class Derived : Base
{
}
Принцип полиморфизма неразрывно связан с наследованием и гласит, что каждый класс наследник может обладать не только свойствами, унаследованными от предка, но и своими собственными. В частности, свойства предка могут быть перекрыты наследником - на место свойств предка могут быть подставлены свойства наследника.
Существование принципа полиморфизма является естественным следствием существования принципа наследования: наследование без изменения набора свойств не имеет смысла. Кроме того, без полиморфизма невозможно реализовать объединение различных объектов (классов) по некоторому набору свойств (невозможно абстрагироваться от части свойств объектов).
С описанными выше понятими связаны следующие ключевые слова:
Разницу между виртуальными и невиртуальными методами демонстрирует следующий пример:
class A
{
public void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B: A
{
new public void F()
{
Console.WriteLine("B.F");
}
public override void G()
{
Console.WriteLine("B.G");
}
}
class Test
{
static void Main()
{
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}
Будет напечатано:
A.F B.F B.G B.G
Интерфейсы определяют набор методов (методов, индексаторов, свойств и событий), которые могут быть реализованы классами. Интерфейс может быть отнаследован от любого количества других интерфейсов. Все методы интерфейсов предполагаются виртуальными и общедоступными.
Класс может реализовывать сколько угодно интерфейсов:
interface IMoveable {
void MoveTo(double x, double y);
void MoveRel(double x, double y);
}
interface IActive
{
string GetResponse(string input);
}
class Terminal : IMoveable, IActive
{
void MoveTo(double x, double y)
{
}
void MoveRel(double x, double y)
{
}
string GetResponse(string input)
{
return input;
}
}