Слайд 1Лекция 5. Введение в классы,
объекты и методы
Язык программирования C#
C# Programming Language
Слайд 3ООП (Объектно-ориентированное программирование) – парадигма программирования, в которой основными концепциями
являются понятия объектов и классов.
Класс – прототип, с которого
создается объект. Класс является основой для приложения; он содержит методы и переменные, которые являются его составляющими. Поля определяют состояние, а методы – поведение будущего объекта.
Слайд 4Класс – модель объекта в реальной жизни (Кошка, Машина, Дом,
и т.д.). Два экземпляра данного класса могут содержать разные данные,
но они всегда имеют одни и те же методы. Существует только один класс автомобилей, но приложение может создать много разных объектов автомобилей (Спорт, Грузовик, Маршрутка).
Объявление класса включает в себя название, поля, конструкторы и методы.
Слайд 10Class
Класс–это конструкция языка, состоящая из ключевого
слова class, идентификатора (имени) и тела.
Класс может содержать в своем
теле: поля, методы, свойства и события.
Поля определяют состояние, а методы поведение будущего объекта.
classMyClass
{
public int field; // Поле
public void Method()// Метод
{
Console.WriteLine(field);
}
}
Слайд 11 Класс представляет собой шаблон, по которому определяется форма объекта. В
нем указываются данные и код, который будет оперировать этими данными.
В C# используется спецификация класса для построения объектов , которые являются экземплярами класса.
Класс, по существу, представляет собой ряд схематических описаний способа построения объекта. При этом очень важно подчеркнуть, что класс является логической абстракцией.
Слайд 12 Физическое представление класса появится в оперативной памяти лишь после того,
как будет создан объект этого класса.
Общая форма определения класса
При определении
класса объявляются данные, которые он содержит, а также код, оперирующий этими данными. Если самые простые классы могут содержать только код или только данные, то большинство настоящих классов содержит и то и другое.
Слайд 13class имя_класса {
// Объявление переменных экземпляра.
доступ
тип переменная1;
доступ тип переменная2;
//...
доступ
тип переменнаяN ;
// Объявление методов.
доступ возращаемый_тип метод1 (параметры) {
// тело метода
}
доступ возращаемый_тип метод2 (параметры) {
// тело метода
}
//. . .
доступ возращаемый_тип методы (параметры) {
// тело метода
}
}
Слайд 14 Перед каждым объявлением переменной и метода указывается доступ.
Члены класса
могут быть как закрытыми (private) в пределах класса, так открытыми
(public), т.е. более доступными.
Спецификатор доступа определяет тип разрешенного доступа.
Указывать спецификатор доступа не обязательно, но если он отсутствует, то объявляемый член считается закрытым в пределах класса.
Члены с закрытым доступом могут использоваться только другими членами их класса.
Слайд 15class Building {
public int Floors; // количество этажей
public
public int Area; // общая площадь
здания
public int Occupants; // количество жильцов
}
доступ тип имя_переменной ;
Определение class обозначает создание нового типа данных. В данном случае новый тип данных называется Building. Объявление class лишь описывает тип, но не создает конкретный объект.
Слайд 16Для того чтобы создать конкретный объект типа Building, придется воспользоваться
следующим оператором.
Building house = new Building(); // создать объект типа
Building
После выполнения этого оператора объект house станет экземпляром класса Building, т.е. обретет "физическую" реальность. Не обращайте пока что внимание на отдельные составляющие данного оператора.
Слайд 17Для доступа к этим переменным служит оператор доступа к члену
класса, который принято называть оператором-точкой. Оператор-точка связывает имя объекта с
именем члена класса. Ниже приведена общая форма оператора-точки.
объект.член
В этой форме объект указывается слева, а член — справа. Например, присваивание значения 2 переменной Floors объекта house осуществляется с помощью следующего оператора.
house.Floors = 2;
оператор-точка служит для доступа к переменным экземпляра и методам.
Слайд 18// Программа, в которой используется класс Building.
using System;
class
Building {
public int Floors; // количество этажей
public int Area; //
общая площадь здания
public int Occupants; // количество жильцов
}
Слайд 19// В этом классе объявляется объект типа Building,
class BuildingDemo
{
static void Main() {
Building house
= new Building(); // создать объект типа Building
int areaPP; // площадь на одного человека
// Присвоить значения полям в объекте house,
house.Occupants = 4;
house.Area = 2500;
house.Floors = 2;
Слайд 20 // Вычислить площадь на одного человека.
areaPP =
house.Area / house.Occupants;
Console.WriteLine("Дом имеет:\n " +
house.Floors + " этажа\n
" +
house.Occupants + " жильца\n " +
house.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
}
}
Слайд 21Дом имеет:
2 этажа
4 жильца
2500 кв. футов общей
площади, из них
625 приходится на одного человека
Слайд 22 Основополагающий принцип: у каждого объекта имеются свои копии переменных экземпляра,
определенных в его классе.
Между обоими объектами не существует никакой
связи, за исключением того факта, что они являются объектами одного и того же типа.
Так, если имеются два объекта типа Building, то у каждого из них своя копия переменных Floors, Area и Occupants, а их содержимое в обоих объектах может отличаться.
Слайд 23// В этой программе создаются два объекта типа Building.
using
System;
class Building {
public int Floors; // количество
этажей
public int Area; // общая площадь здания
public int Occupants; // количество жильцов
}
// В этом классе объявляются два объекта типа Building,
class BuildingDemo {
static void Main() {
Building house = new Building();
Building office = new Building();
int areaPP; // площадь на одного человека
Слайд 24 // Присвоить значения полям в объекте house,
house.Occupants
= 4;
house.Area = 2500;
house.Floors = 2;
// Присвоить значения полям в объекте office,
office.Occupants = 25;
office.Area = 4200;
office.Floors = 3;
Слайд 25 // Присвоить значения полям в объекте house,
house.Occupants
= 4;
house.Area = 2500;
house.Floors = 2;
// Присвоить значения полям в объекте office,
office.Occupants = 25;
office.Area = 4200;
office.Floors = 3;
Слайд 26 // Вычислить площадь на одного человека в жилом доме.
areaPP = house.Area / house.Occupants;
Console.WriteLine("Дом имеет:\n " +
house.Floors + " этажа\n " +
house.Occupants + " жильца\n " +
house.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
Слайд 27 // Вычислить площадь на одного человека в учреждении.
areaPP = office.Area / office.Occupants;
Console.WriteLine("Учреждение имеет:\n " +
office.Floors
+ " этажа\n " +
office.Occupants + " работников\n " +
office.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
}
}
Слайд 28Дом имеет:
2 этажа
4 жильца
2500 кв. футов общей
площади, из них
625 приходится на одного человека
Учреждение имеет:
3 этажа
25 работников
4200 кв. футов общей площади, из них
168 приходится на одного человека
Слайд 29данные из объекта house полностью отделены от данных, содержащихся в
объекте office.
Слайд 30Создание объектов
Building house = new Building();
Эта строка объявления выполняет
три функции.
Во-первых, объявляется переменная house, относящаяся к типу класса
Building. Сама эта переменная не является объектом, а лишь переменной, которая может ссылаться на объект.
Во-вторых, создается конкретная, физическая, копия объекта. Это делается с помощью оператора new.
И наконец, переменной house присваивается ссылка на данный объект. Таким образом, после выполнения анализируемой строки объявленная переменная house ссылается на объект типа Building.
Слайд 31Оператор new динамически (т.е. во время выполнения) распределяет память для
объекта и возвращает ссылку на него, которая затем сохраняется в
переменной.
Следовательно, в C# для объектов всех классов должна быть динамически распределена память.
Слайд 32Объявление переменной house можно отделить от создания объекта, на который
она ссылается, следующим образом.
Building house; // объявить ссылку на объект
house = new Building(); // распределить память для объекта типа Building
В первой строке объявляется переменная house в виде ссылки на объект типа Building. Следовательно, house — это переменная, которая может ссылаться на объект, хотя сама она не является объектом.
А во второй строке создается новый объект типа Building, и ссылка на него присваивается переменной house. В итоге переменная house оказывается связанной с данным объектом.
Слайд 33Объекты классов доступны по ссылке, поэтому классы называются ссылочными типами.
Главное отличие типов значений от ссылочных типов заключается в том,
что именно содержит переменная каждого из этих типов. Так, переменная типа значения содержит конкретное значение. Например, во фрагменте кода
int х;
х = 10;
переменная х содержит значение 10, поскольку она относится к типу int, который является типом значения. Но в строке
Building house = new Building();
переменная house содержит не сам объект, а лишь ссылку на него.
Слайд 34Переменные ссылочного типа и присваивание
В операции присваивания переменные ссылочного типа
действуют иначе, чем переменные типа значения, например типа int.
Когда
одна переменная типа значения присваивается другой, ситуация оказывается довольно простой. Переменная, находящаяся в левой части оператора присваивания, получает копию значения переменной, находящейся в правой части этого оператора.
Слайд 35Сам же объект не копируется.
Building house1 = new Building();
Building house2 = house1;
Переменные house1 и house2, ссылаются на
один и тот же объект. Когда переменная house1 присваивается переменой house2, то в конечном итоге переменная house2 просто ссылается на тот же самый объект, что и переменная house1.
Следовательно, этим объектом можно оперировать с помощью переменной house1 или house2. Например, после очередного присваивания
Слайд 36
house1.Area = 2600;
оба метода WriteLine()
Console.WriteLine(house1.Area);
Console.WriteLine(house2.Area);
выводят одно и
то же значение: 2600.
Слайд 37Несмотря на то что обе переменные, house1 и house2, ссылаются
на один и тот же объект, они никак иначе не
связаны друг с другом. Например, в результате следующей последовательности операций присваивания просто изменяется объект, на который ссылается переменная house2.
Building house1 = new Building();
Building house2 = house1;
Building house3 = new Building();
house2 = house3; // теперь обе переменные, house2 и house3,
// ссылаются на один и тот же объект.
Слайд 38Методы представляют собой подпрограммы, которые манипулируют данными, определенными в классе,
а во многих случаях они предоставляют доступ к этим данным.
Как правило, другие части программы взаимодействуют с классом посредством его методов.
Метод состоит из одного или нескольких операторов. В грамотно написанном коде C# каждый метод выполняет только одну функцию. У каждого метода имеется свое имя, по которому он вызывается. Следует, однако, иметь в виду, что идентификатор Main() зарезервирован для метода, с которого начинается выполнение программы.
Слайд 39· Метод — это именованная часть программы, которая может вызываться
из других частей программы столько раз, сколько необходимо.
· Метод
— это функция или процедура, выполняющая одну задачу.
Слайд 40· О функциях и процедурах. В некоторых языках программирования (например,
в Паскале) функции и процедуры (подпрограммы, не возвращающие значения) чётко
разграничены синтаксисом языка.
В языке С#, — процедуры являются частным случаем (подмножеством) функций, возвращающими значение типа void — пустое значение.
Слайд 42Создание и вызов
Для создания метода необходимо:
1)Указать тип
возвращаемого значения, если метод ничего не возвращает указать void.
2)Выбрать
имя метода в соответствии с действием, которое он выполняет.
Слайд 433)Если метод принимает аргументы – обязательно указать их тип и
имя, если нет – оставить аргументные скобки () пустыми.
4)Если
метод имеет возвращаемое значение, обязательно в теле метода должно присутствовать ключевое слово return. Тип возвращаемого значения метода должен соответствовать типу значения, указанному после ключевого слова return.
Слайд 44Для вызова метода необходимо:
1)Написать имя метода.
2)Обязательно указать после
имени аргументные скобки(), если метод принимает какие-то аргументы, передать соответствующее
количество аргументов соответствующего типа.
Слайд 46class Program
{
static void Procedure()
{
Console.WriteLine("Hello!");
}
static void Main()
{
Procedure();
Console.ReadKey();
}
}
Слайд 47// Добавить метод в класс Building.
using System;
class Building
{
public int Floors; //количество этажей
public int
Area; //общая площадь здания
public int Occupants; //количество жильцов
// Вывести площадь на одного человека,
public void AreaPerPerson() {
Console.WriteLine(" " + Area / Occupants +
" приходится на одного человека");
}
}
Слайд 48// Использовать метод AreaPerPerson().
class BuildingDemo {
static void
Main() {
Building house = new Building();
Building
office = new Building();
Слайд 49// Присвоить значения полям в объекте house,
house.Occupants =
4;
house.Area = 2500;
house.Floors = 2;
// Присвоить значения полям в объекте office,
office.Occupants = 25;
office.Area = 4200;
office.Floors = 3;
Слайд 50Console.WriteLine("Дом имеет:\n " +
house.Floors + " этажа\n " +
house.Occupants +
" жильца\n "
+ house.Area +
"кв. футов общей площади,
из них");
house.AreaPerPerson() ; // В этой строке //вызывается метод AreaPerPerson() для объекта house.
Console.WriteLine();
Слайд 51 Console.WriteLine("Учреждение имеет:\n " +
office.Floors + " этажа\n " +
office.Occupants
+ " работников\n " +
office.Area +
" кв. футов
общей площади, из них");
office.AreaPerPerson() ;
}
}
Слайд 52Дом имеет:
2 этажа
4 жильца
2500 кв. футов общей площади,
из них
625 приходится на одного человека
Учреждение имеет:
3 этажа
25 работников
4200 кв. футов общей площади, из них
168 приходится на одного человека
Слайд 53// Возвратить значение из метода AreaPerPerson().
using System;
class Building
{
public int Floors; // количество этажей
public int Area; // общая площадь здания
public int Occupants; // количество
жильцов
// Возвратить величину площади на одного человека,
public int AreaPerPerson() {
return Area / Occupants;
}
}
Слайд 54// Использовать значение, возвращаемое методом AreaPerPerson().
class BuildingDemo {
static void Main() {
Building house = new Building();
Building office = new Building();
int areaPP; // площадь на одного человека
Слайд 55// Присвоить значения полям в объекте house,
house.Occupants =
4;
house.Area = 2500;
house.Floors = 2;
// Присвоить значения полям в объекте office,
office.Occupants = 25;
office.Area = 4200;
office.Floors = 3;
Слайд 56 // Получить площадь на одного человека в жилом доме.
areaPP = house.AreaPerPerson();
Console.WriteLine("Дом имеет:\n " +
house.Floors +
" этажа\n " +
house.Occupants + " жильца\n " +
house.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
Console.WriteLine();
Слайд 57 // Получить площадь на одного человека в учреждении.
areaPP = office.AreaPerPerson();
Console.WriteLine ("Учреждение имеет :\n " +
office.Floors
+ " этажа\n " +
office.Occupants + " работников\n " +
office.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
}
}
Слайд 58 class Program
{
static int Add(int summand1, int summand2)
{
return
summand1 + summand2;
}
static void Main()
{
int summand1 = 2, summand2 = 3;
int sum = Add(summand1, summand2);
Console.WriteLine("{0} + {1} = {2}", summand1, summand2, sum);
// Delay.
Console.ReadKey();
}
}
Слайд 59namespace WindowsFormsApp30
{
public partial class Form1 : Form
{
static int Add(int summand1, int
summand2)
{
return summand1 + summand2;
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int summand1 = 2, summand2 = 3;
int sum = Add(summand1, summand2);
MessageBox.Show("sum="+sum.ToString());
}
}
Слайд 60Повторение:
Для преобразования текста, находящегося, например, в поле редактирования, в целое
число нужно использовать функцию Convert.ToInt32(), в дробное число — Convert.ToDouble()
a
= Convert.ToInt32(textBox1.Text);
Слайд 61Повторение:
Преобразовать численное значение в строку позволяет метод ToString().
label1.Text =
"summand1 + summand2 = " + sum.ToString();
MessageBox.Show("sum="+sum.ToString());
Слайд 62class Program
{
// Методы, которые
возвращают логическое значение, называют методами-предикатами.
static bool
And(bool a, bool b)
{
return a && b;
}
static void Main()
{
bool operand1 = true, operand2 = true;
bool result = And(operand1, operand2);
Console.WriteLine("{0} && {1} = {2}", operand1, operand2, result);
// Delay.
Console.ReadKey();
}
}
Слайд 63 class Program
{
static string
Compare(int value1, int value2)
{
if (value1 < value2)
{
return "Comparison Less Then";
}
else if (value1 > value2)
{
return "Comparison Greater Then";
}
return "Comparison Equal";
}
Слайд 64static void Main()
{
int operand1 = 1, operand2 = 2;
string result = Compare(operand1, operand2);
Console.WriteLine(result);
// Delay.
Console.ReadKey();
}
}
Слайд 65class Program
{
static string Function(string
name)
{
// Выполняем проверку. При обнаружении ошибок завершаем работу.
if (name == "fool") // Сторожевой оператор.
{
return "Вы использовали недопустимое слово.";
}
// Код номинального варианта.
string sentence = "Hello " + name + "!";
return sentence;
}
Слайд 66 static void Main()
{
string sentence = Function("fool");
Console.WriteLine(sentence);
// Delay.
Console.ReadKey();
}
}