|
|
1.8 КлассыКлассы используются для определения новых типов данных. C# поддерживает только одиночное наследования. Класс может реализовывать различные интерфейсы. Членами класса могут быть константы, переменные, методы, свойства, индексаторы, события, операторы, конструкторы, деструкторы и также вложенные объявления типов.
Каждый член класса имеет свою форму доступа. Форм всего пять: 1.9 СтруктурыСтруктуры и классы очень похожи. Структуры могут реализовывать интерфейсы и включать в свой состав тоже что и классы. Но есть и серьезные отличия. Структуры больше подходят для использования по значению, нежели по указателю. Наследования для структур не поддерживается. Значения структур хранятся в стеке. Аккуратные программисты могут очень неплохо увеличить производительность программы, используя структуры. Для примера: использование структуры вместо класса для Point может привести к сильному упрощению работы с памятью. Программа, представленная ниже, создает и инициализирует массив из 100 точек. При реализации Point классом мы получаем 101 объект - массив и 100 элементов. class Point
{
public int x, y;
public Point() {
x = 0;
y = 0;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
Если же Point реализовать структурой, как в следующем примере:
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
то программа будет содержать только один объект - массив. Элементы Point будут расположены внутри массива. Хотя конечно подобное упрощение может и не сыграть большой роли. Использование структур вместо классов в некоторых случаях может сделать ваши программы объемнее и замедлить их выполнение, в связи с тем что передача структуры по значению происходит медленнее чем передача класса по указателю.
1.10 ИнтерфейсыИнтерфейс это некоторое соглашение, и класс или структура, реализующие его, должны этого соглашения придерживаться. interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);
представляет собой интерфейс, содержащий индексатор, событие E, метод F и свойство P.
Интерфейсы поддерживают множественное наследование. Следующий пример демонстрирует интерфейс IcomboBox, который наследуется от ItextBox и IlistBox: interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
Классы и структуры могут реализовывать несколько интерфейсов. В следующем примере класс EditBox произошедший от класса Control реализует два интерфейса Icontrol и IdataBound:
interface IDataBound
{
void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound
{
public void Paint();
public void Bind(Binder b) {...}
}
В этом примере метод Paint из интерфейса Icontrol и метод Bind интерфейса IdataBound реализованы с использованием public членов класса EditBox. C# позволяет реализовать эти методы иначе, чтобы эти методы не были public. Члены интерфейса могут быть реализованы с использованием расширенного имени. Для примера переделаем класс EditBox следующим образом:
public class EditBox: IControl, IDataBound
{
void IControl.Paint();
void IDataBound.Bind(Binder b) {...}
}
Интерфейсные элементы, реализованные таким образом, называются реализованными явно, потому что каждый метод точно указывает на метод интерфейса, который он реализует.
Явные методы интерфейса можно вызвать только через интерфейс. Например метод Paint в EditBox можно вызвать только обращением к интерфейсу Icontrol: class Test
{
static void Main() {
EditBox editbox = new EditBox();
editbox.Paint(); // error: EditBox does not have a Paint method
IControl control = editbox;
control.Paint(); // calls EditBox's implementation of Paint
}
}
1.11 ДелегатыДелегаты позволяют использовать сценарии адресации функций. В отличии от указателей на функции делегаты объектно-ориентированны, типизированы и безопасны. Делегаты наследуются от базового класса System.Delegate. Любой делегат инкапсулирует метод вызова. Если у вас есть делегат и подходящий набор аргументов, то его можно вызвать с этим набором аргументов. Как и статические методы метод вызова состоит из класса и статического метода этого класса. Интересным и полезным свойством делегатов является то, что они не заботятся о типе объекта, на который они указывают. Подойдет любой. Это делает делегаты прекрасным аппаратом для анонимных вызовов. При использовании делегата необходимо сделать три вещи: объявить делегат, создать его экземпляр и вызвать. Делегаты объявляются при помощи синтаксиса объявления делегатов. Например делегат без аргументов, возвращающий void может быть описан следующим образом: delegate void SimpleDelegate();Для создания нового экземпляра делегата используется ключевое слово new. После того как делегат создан его можно вызывать как метод. Пример: class Test
{
static void F() {
System.Console.WriteLine("Test.F");
}
static void Main() {
SimpleDelegate d = new SimpleDelegate(F);
d();
}
}
SimpleDelegate создается и сразу вызывается.
Конечно нет смысла в описании делегата, только для того чтобы его сразу вызвать, короче было бы просто вызвать нужный метод. Делегаты хороши, когда они вызывают метод анонимно. Например мы можем определить метод MultiCall, который будет циклически вызывать SimpleDelegate: void MultiCall(SimpleDelegate d, int count) {
for (int i = 0; i < count; i++)
d();
}
}
1.12 Перечисленияenum объявляет тип для логически связанных групп символьных констант. Перечисления обычно используются для диалогов выбора, в которых общение с пользователем происходит посредствам выбора некоторых опций, выводимых на экран. Пример: enum Color {
Red,
Blue,
Green
}
class Shape
{
public void Fill(Color color) {
switch(color) {
case Color.Red:
...
break;
case Color.Blue:
...
break;
case Color.Green:
...
break;
default:
break;
}
}
}
демонстрирует перечисление Color и метод его использующий. Использование перечислений делает код более читабельным.
|
|||
|
|
||||