С# и ООП
Формальное определение класса с C# Класс в C# - это пользовательский тип данных (user defined type), который состоит из данных (часто называемых атрибутами и свойствами) и функциями для выполнения с этими данными различных действий (эти функции обычно называются методами).
class Employee { private string fullName; private int empID; private float currPay; public Employee() {} public Employee (string fullName, int empID, float currPay) { this. fullName = fullName; this.empID = empID; this. currPay = currPay: } public void GiveBonus (float amount) { currPay += amount; } public virtual void DisplayStats() { Console. WriteLine ("Name: {0}", fullName); Console.WriteLine (Pay: {0}, currPay); Console.WriteLine (ID: {0}, empID); Console.WriteLine (SSN: {0}". ssn); }
// Вызываем конструктор по умолчанию Employee e = new Employee(): // Вызываем пользовательский конструктор public static void Main() { Employee e = new Employee (Joe, 80, 30000); e.GiveBonus (200); Employee e2; e2 = new Employee ("Beth, 81, 50000); e2.GiveBonus (1000); e2.DisplayStats(), }
Ссылки на самого себя public Employee (string fullName, int empID, float currPay) { tnis.fullName = fullName; this.enpID = empID; this.currPay = currPay; } В определениях пользовательских конструкторов часто используется зарезервированное слово this
Перенаправление вызовов конструктора с использованием слова this class Employee { public Employee (string fullName, int empID, float currPay) { this.fullName = fullName; this.empID = empID; this.currPay = currPay; } public Employee (string fullName) :this(fullName, IDGenerator.GetNewEmpID(), O.OF) {} }
Открытый интерфейс по умолчанию для класса – это набор открытых членов данного класса. это набор тех переменных, свойств и методов-членов, к которым можно обратиться в формате имя_объекта.член_класса (с точки зрения обращения к членам класса). это набор тех членов класса, которые объявлены с использованием ключевого слова public (с точки зрения определения класса). В C# открытый интерфейс по умолчанию для класса может состоять из следующих членов этого класса: Методов Свойств Полей Определение открытого интерфейса по умолчанию
// Теперь этот класс можно создавать из-за пределов сборки, в которой он определен public class HelloClass { // Любое количество методов с любым количеством параметров // Конструктор по умолчанию и пользовательские конструкторы // Если в этом классе определена и точка входа для всей программы, // то еще и статический метод Main () } // Внутренние классы могут использоваться только внутри той сборки, в которой они определены internal class HelloClassHelper { }
Важнейшие «столпы» объектно-ориентированного программирования инкапсуляция наследование полиморфизм
Инкапсуляция // Класс DBReader скрывает за счет инкапсуляции подробности открытия // и закрытия баз данных DBReader f = new DBReader(); f.Open ("C:\foo.mdf"); // выполняем с базой данных нужные нам действия f.Close();
Для обращения к внутренним данным можно использовать один из двух способов: создать традиционную пару методов один для получения информации (accessor), второй для внесения изменений (mutator); определить именованное свойство.
Реализация инкапсуляции при помощи традиционных методов доступа и изменения // Определение традицонных методов доступа и изменения //для закрытой переменной public class Employee { private string fullName; // Метод доступа public string GetFullName() {return fullName; } // Метод изменения public void SetFullName (string n). { // Логика для удаления неположенных символов #, $, % и прочих // Логика для проверки максимальной длины и прочего full Name = n; }
Второй способ инкапсуляции: применение свойств класса Помимо традиционных методов доступа и изменения для обращения к закрытым членам класса можно также использовать свойства (properties). // Обращение к имени сотрудника через свойство public static int Main(string[] args) { Employee p = new Employee(); // Устанавливаем значение p.EmpID = 81; // Получаем значение Console.WriteLine(Person ID Is: {0}, p.EmpID); return 0; }
Синтаксис класса Employee с определением свойства EmpID: // Пользовательское свойство EmpID для доступа к переменной empID public class Employee { private Int empID; // Свойство для empID public Int EmpID { get {return empID;} set { // Здесь вы можете реализовать логику для проверки вводимых // значений и выполнения других действий empID = value; }
Внутреннее представление свойств С# Многие программисты стараются использовать для имен методов доступа и изменения соответственно приставки get_ и set_(например, get_Name() и set_Name()). С# для внутреннего представления свойства использует методы с теми же самыми префиксами. Если вы откроете сборку EmpLoyees.exe при помощи утилиты ILDastn.exe, вы увидите, что каждому свойству соответствуют два отдельных метода. Поэтому подобное определение класса вызовет ошибку компилятора: // Помните, что свойство С# автоматически отображается в пару методов get/set public class Employee { // Определение свойства public string SSN { get { return ssn;} // Отображается в get_SSN() set { ssn = value;} // Отображается в set_SSN() } // Ошибка! Эти методы уже определены через свойство SSN! public string get_SSN() { return ssn; } public string set_SSN (string val) { ssn = val; } }
Свойства только для чтения, только для записи public class Employee { // Будем считать, что исходное значение этой переменной присваивается // с помощью конструктора класса private string ssn; // А вот так выглядит свойство только для чтения public string SSN ( get { return ssn; } }
Статические свойства // Со статическими данными должны работать статические свойства public class Employee { private static string CompName; // Статическая переменная public static string Company // Статическое свойство { get { return CompName; } set { CompName = value; } } Обращение к статическим свойствам производится так же, как и к статическим методам; // Задаем и получаем информацию об имени компании public static int Main(string[] args) { Employee. Company = "Intertech, Inc"; Console. WriteLine( "These folks work at {0}", Employee. Company); }
Статические конструкторы // Статические конструкторы используются для инициализации статических переменных public class Employee { private static string CompName; static Employee() { CompName = "Intertech, Inc"; } Если нам потребуется использовать свойство Employee.Company, присваивать ему исходное значение не придется статический конструктор сделает это за нас автоматически : // Значение свойства ("Intertech. Inc") будет автоматически установлено // через статический конструктор public static int Main(string[] args) { Console. WriteLine(These folks work at {0}, Employee.Company); }
Псевдоинкапсуляция: создание полей «только для чтения» public class Employee { // Поле только для чтения (его значение устанавливается конструктором): public readonly string SSNFIeld; }
Статические поля «только для чтения» // В классе Tire определен набор полей только для чтения public class Tire { public static readonlyTire GoodStone = new Tire(90); public static readonly Tire FireYear = new Tire(100); public static readonly Tire ReadyLine = new Tire(43); public static readonly Tire Blimpy = new Tire(83); private int manufacturelD; public int MakeID { get { return manufacturelD;} } public Tire (int ID) { manufactureID = ID; }