Шаг 5 - Классы, структуры и интерфейсы.

Определяются соответственно ключевыми словами 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;
	}
}


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Сергей Радкевич