
- •Программирование на языке Visual c#
- •14. Объектно-ориентированное программирование
- •14.1. Основные принципы ооп
- •14.2. Объекты
- •14.3. Классы
- •14.4. Определение классов и их членов
- •14.4.1. Определение полей
- •14.4.2. Определение свойств
- •14.4.3. Определение методов
- •14.4.4. Конструкторы
- •14.5. Статические классы и их члены
- •9.5. Члены классов
9.5. Члены классов
Как уже говорилось ранее, членами классов являются поля, методы, свойства и события, объявленные в области видимости класса. Использование различных членов класса рассмотрим на следующем примере.
Пример 14.3.
using System;
namespace ClassDemo
{ public class Human
{ private string HumanName = ""; // Определение поля Имя
private short HumanAge = 0; // Определение поля Возраст
// Объявление событий (2-стр.82), уведомляющих о смене имени и возраста
// public event NameChangedEventHandler NameChanged(string NewNameValue);
// public event AgeChangedEventHandler AgeChanged(short NewAgeValue);
public string Name // Определение свойства Имя
{ get
{ return HumanName; // Возврат значения, хранимого в поле
}
set //(string Value)
{ HumanName = value; // Сохранение значения в поле
// Рассылка события смены имени
// NameChanged(HumanName);
}
}
public short Age // Определение свойства Возраст
{ get
{ return HumanAge; // Возврат значения, хранимого в поле
}
set //(short Value)
{ if (value < 0 | value > 200)
{ // Вывод сообщения об ошибке изменения возраста
Console.WriteLine("Возраст должен быть между " +
"0 и 200 годами.");
}
else
if (HumanAge != value)
{ HumanAge = value; // Сохранение значения в поле
// Рассылка события смены возраста
// AgeChanged(HumanAge);
}
}
}
public void OutputName() // Определение метода вывода имени
{ Console.WriteLine(HumanName);
}
}
public class HumanDemo
{ // private void SomeNameChanged(string name)
// { // Обработка события смены имени
// Console.WriteLine("Имя изменено на " + name);
// }
// private void SomeAgeChanged(short age)
// { // Обработка события смены возраста
// Console.WriteLine("Возраст изменен на " + age.ToString());
// }
static void Main() // Точка входа в программу
{ Human h = new Human(); // Создание экземпляра класса
// (объекта)
// Регистрация обработчиков двух событий
// AddHandler h.NameChanged, AddressOf SomeNameChanged
// h.NameChanged += new EventHandler(SomeNameChanged);
// AddHandler h.AgeChanged, AddressOf SomeAgeChanged
// h.AgeChanged += new EventHandler(SomeAgeChanged);
h.Name = "Иванов А.П."; //?Вызывает обработку события
// изменения имени
h.OutputName(); // Вывод имени
h.Age = 25; //?Вызывает обработку события
// изменения возраста
Console.WriteLine(h.Age); // Вывод возраста
h.Age = 25; // Не вызывает обработку события,
// т.к. возраст не изменился
h.Age = -20; // Не вызывает обработку события,
// т.к. возраст не может быть
// отрицательным. Выводит сообщение
Console.WriteLine(h.Age); // Вывод возраста. Результат тот же
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
}
/* Вывод:
? Имя изменено на Иванов А.П.
Иванов А.П.
? Возраст изменен на 25
25
Возраст должен быть между 0 и 200 годами.
25
*/
2. Наследование (MSDN_ООП_VB+C#_2010)
Наследование позволяет создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в другом классе. Класс, члены которого наследуются, называется базовым классом, а класс, который наследует эти члены, называется производным классом. Следует учитывать, что все классы в C# и Visual Basic неявно наследуются от класса Object, который поддерживает иерархию классов .NET и предоставляет низкоуровневые службы для всех классов.
Примечание. Управляемые языки в .NET Framework не поддерживают множественное наследование, т.е. можно задать только один базовый класс для производного класса.
Наследование от базового класса:
class DerivedClass:BaseClass{}
По умолчанию унаследовать класс можно от любого класса. Однако можно указать, должен ли класс использоваться в качестве базового класса, или создать класс, который может использоваться только в качестве базового.
Указание, что класс не может использоваться в качестве базового класса:
public sealed class A {}
Указание, что класс может использоваться только в качестве базового класса и нельзя создать экземпляр этого класса:
public abstract class B {}
Переопределяющие члены.
По умолчанию производный класс наследует все члены от своего базового класса. Если необходимо изменить поведение унаследованного члена, необходимо переопределить его. Т.е. в производном классе можно определить новую реализацию метода, свойства или события.
Следующие модификаторы используются для управления переопределением свойств и методов.
Модификатор Visual Basic |
Модификатор C# |
Определение |
Overridable (Visual Basic) |
virtual (Справочник по C#) |
Разрешает переопределение члена класса в производном классе. |
Overrides (Visual Basic) |
override (Справочник по C#) |
Переопределяет виртуальный (переопределяемый) член в базовом классе. |
NotOverridable (Visual Basic) |
Не поддерживается |
Запрещает переопределение члена в наследующем классе. |
MustOverride (Visual Basic) |
abstract (Справочник по C#) |
Требует, чтобы член класса был переопределен в производном классе. |
Shadows (Visual Basic) |
Модификатор new (Справочник по C#) |
Скрывает член, наследуемый от базового класса |