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