лекция. Сборник лекций по МДК _Технология разработки программного обеспе. Курс лекций для специальности спо базовой подготовки
Скачать 4.41 Mb.
|
Стиль программирования Технология программирования - это совокупность методов и средств раз- работки (написания) программ и порядок применения этих методов и средств. В настоящее время технологии программирования разделяют по исполь- зуемым стилям программирования на процедурное (структурное), функцио- нальное, логическое и объектно-ориентированное программирование. Они различаются по уровню абстракции данных, используемым моделям вычисле- ний, классам решаемых задач. Ниже дана характеристика перечисленных стилей программирования. 1.1. Процедурное программирование Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, предложенной фон Нейманом в 40-х годах. Процедурная программа состоит из последовательности операторов и пред- ложений, управляющих последовательностью их выполнения. Типичными операторами являются операторы присваивания и передачи управления, опе- раторы ввода/вывода и специальные предложения для организации циклов. Из них можно составлять фрагменты программ и подпрограммы. В основе такого программирования лежит взятие значения какой-то переменной, совершение над ним действия и сохранение нового значения с помощью оператора при- сваивания, и так до тех пор пока не будет получено (и, возможно, напечатано) желаемое окончательное значение. Знакомый многим пример неимперативного программирования - элек- тронная таблица. В ней значения ячеек задаются выражениями, а не команда- ми, определяющими, как вычислять это значение. Нигде также не задается по- рядок вычисления значений ячеек, гарантируется, что вычисления будут вы-5 полнены в правильном порядке с учетом зависимости ячеек друг от друга. В электронной таблице не используется присваивание, то есть указание изме- нить текущее значение ячейки. Если мы не управляем сами последовательно- стью вычислений, то мы и не знаем, когда произойдет присваивание, а поэто- му от него мало пользы. К процедурным языкам относятся Basic, Cobol, Fortran, Pascal, C и Ada. 1.2. Структурное программирование Структурный подход к разработке ИС заключается в ее декомпозиции (разбие- нии) на автоматизируемые функции: система разбивается на функциональные подсистемы, которые в свою очередь делятся на подфункции, подразделяемые на задачи и подзадачи. Структурное программирование основано на следующих принципах: - программирование должно осуществляться сверху-вниз; - весь проект должен быть разбит на модули с одним входом и одним выходом ; - логика алгоритма и программы должна допускать только три основные структу- ры - последовательное выполнение, ветвление и повторение. Недопустим оператор передачи управления в любую точку программы; - при разработке документация должна создаваться одновременно с программиро- ванием, в виде комментариев к программе. Цель структурного программирования - повышение надежности программ, обеспечение сопровождения и модификации, облегчение и ускорение разработки. Идеи структурного программирования появились в начале 70-годов в компании IBM, в их разработке участвовали такие известные ученые как Э. Дейкстра, Х. Милс, Э. Кнут, С. Хоор. 6 1.3. Функциональное программирование Программа, разработанная с использованием функционального (апплика- тивного) стиля, состоит из совокупности определений функций. Функции, в свою очередь, представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Вычисления начинаются с вызо- ва некоторой функции, которая в свою очередь вызывает функции, входящие в ее определение и т. д. в соответствии с иерархией определений и структурой условных предложений. Функции часто либо прямо, либо опосредованно вы- зывают сами себя. Каждый вызов возвращает некоторое значение в вызвавшую его функ- цию, вычисление которой после этого продолжается; этот процесс повторяет- ся до тех пор, пока запустившая вычисления функция не вернет конечный ре- зультат пользователю. "Чистое" функциональное программирование не признает присваиваний и передач управления. Разветвление вычислений основано на механизме обра- ботки аргументов условного предложения. Повторные вычисления осуществ- ляются через рекурсию, являющуюся основным средством функционального программирования Первый функциональный язык программирования (Лисп) был разработан американским ученым Дж. Маккарти (J. McCarthy) в 1958-1961 гг. на основе алгебры списочных структур, лямбда-исчисления и теории рекурсивных функций. К настоящему времени созданы такие функциональные языки про- граммирования как Scheme, Рефал, Haskell, Sisal. 7 1.4. Логическое программирование Логическое (реляционное) программирование исходит из того, что компью- тер должен уметь работать по логическим построениям, присущим человеку. На- пример, в логическом программировании разрешена конструкция типа "Опреде- лить фирму, имеющую самую высокую в городе среднюю зарплату сотрудников", которой достаточно, чтобы получить ответ. Программа в таких языках представляет собой совокупность правил (оп- ределяющих отношения между объектами) и цели (запроса). Процесс выпол- нения программы трактуется как процесс установления общезначимости ло- гической формулы по правилам, установленным семантикой того или иного языка. Результат вычислений является побочным продуктом процедуры выво- да. Такой метод являет собой полную противоположность программирования на каком-либо из процедурных языков. В реляционном программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые необходимо выполнить. Примером логического языка программирования можно назвать PROLOG - язык, предназначенный для программирования приложений, использующих средства и методы искусственного интеллекта, создания экспертных систем и представления знаний. 1.5. Объектно-ориентированное программирование Объектно-ориентированная технология разработки программ состоит из объектно-ориентированного анализа, объектно-ориентированного проектирования и объектно-ориентированного программирования. Объектно-ориентированный анализ состоит в объектной декомпозиции предметной области, т.е. информационная система представляется не набором8 Выполнить заказ Занести в план Оформить на- кладную Отпустить товар Проверить на- личие товара на складе Изменить количество товара на складе Рисунок 1. – Фрагмент функциональной схемы системы складского учета. Включить то- вар в наклад- ную Передать товар за- казчику функций, а совокупностью объектов, взаимодействующих друг с другом. Деком- позиция – это разделение сложной программной системы на все меньшие и мень- шие подсистемы, каждую из которых можно совершенствовать независимо[1]. Структурное проектирование предполагает алгоритмическую декомпозицию, по- нимаемую как разделение алгоритмов, где каждый модуль системы выполняет один из этапов общего процесса. На рис.1 показан фрагмент функциональной схе- мы для системы складского учета. Эту схему можно рассматривать как пример ал- горитмической декомпозиции. Приведенной на рис. 1 декомпозиции существует альтернатива, представ- ленная на рис.2. Здесь предметная область представлена как совокупность неко- Заказ Товар Накладная включить Склад Проверить наличие Изменить количество оформить принять Рисунок 2.-Объектно-ориентированная декомпозиция Заказчик передать9 торых автономных объектов, которые взаимодействуют друг с другом, чтобы обеспечить функционирование всей системы в целом. Объекты обладают поведением, состоянием, свойствами, которые в про- грамме реализуются в виде подпрограмм (функций). Таким образом, объектно- ориентированная технология включает в себя возможности структурного подхода, но объектно-ориентированное проектирование в большей степени реализует мо- дель реального мира и соответствует естественной логике человеческого мышле- ния. По мнению автора С++, Бьерна Страуструпа[2], различие между проце- дурным и объектно-ориентированным стилями программирования заключается примерно в следующем: программа на процедурном языке отражает "способ мышления" процессора, а на объектно-ориентированном - способ мышления про- граммиста. Отвечая требованиям современного программирования, объектно- ориентированный стиль программирования делает акцент на разработке новых типов данных, наиболее полно соответствующих концепциям выбранной области знаний и задачам приложения. Сравнивая объектно-ориентированный и процедурный стиль программирова- ния (подробно остановимся на этих двух технологиях, поскольку для остальных характерна некоторая функциональная ограниченность, не позволяющая исполь- зовать их для решения широкого круга задач), необходимо выбрать критерий сравнения. Основной критерий в оценке программных продуктов – сложность[1] , а основными требованиями к методологиям разработки являются: удобство со- провождения, возможность безболезненного наращивания уже существующей программы, способность разработанных программных объектов к повторному ис- пользованию. При этом на второй план отступает такое требование, как быстрое проектирование первоначальной версии программы, потому что его воплощение обычно не позволяет соблюсти все остальные условия. Дело в том, что процесс разработки программного обеспечения не заканчивается первой версией. Он сво- дится к итеративному расширению предыдущих версий, что, в некоторой степени, 10 и помогает решать проблему сложности. В борьбе с проблемами, определяемыми сложностью программ, дальше всех продвинулась объектно-ориентированная технология, которая и получила наибольшее распространение. В настоящее время она успешно развивается по самым разным направлениям, затрагивая как анализ и проектирование программных систем, так и написание самих программ. Послед- нее определяется как объектно-ориентированное программирование и связано с использованием соответствующих объектно-ориентированных языков. В качестве примера языков, поддерживающих объектно-ориентированный стиль программи- рования, можно привести С++, Object Pascal, Smalltalk, Ada, Eiffel. Развитие ООП практически вытеснило процедурное программирование из раз- работки сложных программных систем. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ ПРОГРАММНЫХ ПРОДУКТОВ 1. Класс Класс - это макет. Что такое макет? Макет – это схематический чертеж плана будущего проекта. Например, если Вы планируете строить новый дом, инженер объяснит план его конструирования, демонстрируя макет, как на рисунке ниже. После этого инженер на основе макета начнет строительство дома. Как и макет, у класса есть чертеж программы. Используя класс, можно создать собственный метод, указать значения переменных, а через объекты получить доступ к методам классов и их переменным значениям. Класс должен иметь значения переменных, методы и объекты. ООП проще объяснить на примерах из жизни. Представьте дом в качестве примера для класса. В доме есть комнаты: гостиная, спальня, кухня - и техника, например, телевизор и холодильник. Владелец дома может пользоваться всеми комнатами и приспособлениями своего дома. То же можно сказать и о классе с группой методов и значений переменных. Комнаты с техникой – пример методов и значений переменных. Чтобы использовать класс, методы или значения переменных, используются объекты. Объекты являются примерами класса. Дом без комнат и техники будет пустым и никто не будет в нем жить, пока комнаты и техника не появятся. Пустой дом - класс. Так что же такое использование класса без методов и значений переменных? Для этого рассмотрим пример целостного дома. Аналогично, класс будет идти вместе с группой значений переменных, методов и объектов. Классы и объекты – фундаментальные понятия объектно-ориентированного программирования (ООП). Класс запускается введением ключевого слова «класс» и рядом указывается название Вашего класса. Вы можете дать любое название для класса. Далее нужно открыть и закрыть скобки, как показано на примере. class ShanuHouseClass1 { } 2. Объект Владелец дома может получить доступ и использовать все комнаты дома и технику. Аналогично, для доступа к классовому методу и значениям переменных нужно использовать объекты. Можно создать один или несколько объектов для того же класса. Например, можно сказать, что бывает один или много владельцев дома. Ниже Вы увидите пример объекта, где "objHouseOwner" - это объект класса, который будет использоваться для доступа ко всем переменным параметрам и методам класса. ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1(); 3. Значение переменной Значения переменных используются для хранения наших характеристик. Наша характеристика может быть представлена в числовом виде или в виде текста. Например, чтобы сохранить номер телефона, можно использовать тип переменной "int", а чтобы сохранить имя, можно использовать измененный тип строки с именем для каждой переменной. Переменные могут быть локальными или глобальными. Например, если Вы покупаете новый телевизор, к Вам придет специалист, чтобы настроить телевидение. Он даст Вам свой контактный номер на будущее. Скорее всего, Вы запишите его номер на бумажке и положите ее туда, где сможете быстро найди, когда она понадобится. Если Вы будете хранить этот листок на видном месте, то все Ваши гости смогут увидеть его. Глобальные или общие переменные похожи на этот пример. Если определить значение переменной как глобальное, то все методы внутри класса смогут получить доступ к значению переменной. Если Вы храните бумажку с номером в известном только Вам месте, то только Вы и видите контактный номер. Локальные частные переменные с этим схожи. Синтаксис значений переменных: Модификаторы доступа-тип данных-имя переменной По умолчанию доступ к модификаторам скрыт. Вы можете использовать общий доступ для переменных. Пример переменной: int noOfTV = 0; public String yourTVName; private Boolean doYouHaveTV = true; class ShanuHouseClass { int noOfTV = 2; public String yourTVName = "SAMSUNG"; static void Main(string[] args) { ShanuHouseClass objHouseOwner = new ShanuHouseClass(); Console.WriteLine("You Have total " + objHouseOwner.noOfTV + " no of TV :"); Console.WriteLine("Your TV Name is :" + objHouseOwner.yourTVName); } } В предыдущем примере программ Вы определили два значения переменных внутри класса. При применении основного метода создается объект класса. Можно получить доступ к значению переменной класса и вывести изображение. Основным методом является метод по умолчанию в C#, где каждый консоль и приложение для Windows начнет выполнять программу. В основном методе можно определить объект для класса и использовать его, можно получить доступ ко всем значениям переменных параметров и методов класса. Допустим, что каждый дом имеет въездные ворота. Используя ворота, Вы попадаете в свой дом. Аналогично, чтобы запустить программу, должен быть метод по умолчанию, который будет запускать программу. Основной метод полезен при запуске программы. Каждый раз, когда Вы будете запускать C# Console или приложение Windows, основной метод будет выполняться первым. Из основного метода можно создать объект для других классов и использовать их методы. 4. Метод или функции (метод функционирования) Метод – это группа из операторов кода. Вот предыдущий пример программы с методом функционирования. class ShanuHouseClass { int noOfTV = 2; public String yourTVName = "SAMSUNG"; public void myFirstMethod() { Console.WriteLine("You Have total " + noOfTV + "no of TV :"); Console.WriteLine("Your TV Name is :" + yourTVName); Console.ReadLine(); } static void Main(string[] args) { ShanuHouseClass objHouseOwner = new ShanuHouseClass(); objHouseOwner.myFirstMethod(); } } Примечание: Большинство разработчиков интересовались разницей между методами и функциями. В этой статье понятие метода используется вместо понятия функции. Тем не менее, есть одно отличие между методами и функциями. В ООП языках, таких как C #, Java и т.д. используется термин метод, а для не-ООП программирования, таких как "C" и других – функция. Использование методов. Предположим, что у Вас есть мобильный телефон и Вы храните на нем много песен. Тем не менее, Вы всегда любите слушать определенные песни. Очень сложно каждый раз выискивать из сотен песен на телефоне любимую и проигрывать ее. Вместо того, чтобы проделывать одну и ту же работу много раз, Вы можете использовать плейлисты. Щёлкните на плейлист и слушайте любимую музыку. Это облегчит Вашу работу, и Вам не придется повторять одни и те же действия постоянно. Методы используются как плейлист. Можно писать повторные коды для одного метода, а затем при необходимости использовать его. В доме может быть одна большая комната или несколько комнат, и в каждой есть какое-то оборудование. Точно так же в классе можно увидеть один или несколько методов. В доме может быть две или три спальни, но кажая спальня отличается по размеру, цвету и так далее. Это означает, что одни и те же комнаты все равно разного типа. Так и в классе можно создать более одного метода с тем же именем, но с другим параметром. В ООП это называется "полиморфизм". Синтаксис функций. Модификаторы доступа, тип возвращения, название метода (список параметров): Модификаторы доступа: о них будет сказано далее в статье. Тип возвращения: Если Ваш метод возвращает значение, тогда Вам следует использовать тип возвращения с любым типом данных, такие как string, int и так далее. Если метод не возвращает значение, используйте тип "Void". Название метода: Здесь Вы задаете имя каждому методу. Список параметров: список параметров или аргументов, которые Вы передаете функции. Ниже приведен пример способа. • Метод с типом Void: Void - ключевое слово, благодаря которому данные из методов не возвращаются. public void veranda() { Console.WriteLine("Welcome to Veranda"); Console.WriteLine("How Many Chairs Do you have in your Veranda"); NoofChair = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda"); } • Метод с типом возврата: метод обернется в какой-то результат, который может использоваться в программе. Например, возьмем метод TVNAME с типом возврата "String". Можно сказать, что у Вас в доме есть телевизор в гостиной, родительской спальне и детской. В каждой комнате стоит телевизор разных фирм. Предположим, Вы хотите узнать название бренда телевизора. Вам нужно ввести один и тот же код трижды. Вместо повторного написания одинакового кода, Вы можете воспользоваться методом с типом возврата. public string TVNAME() { Console.WriteLine("Enter Your TV Brand NAME"); YOURTVName = Console.ReadLine(); return YOURTVName; } • Метод со списком параметров: До сих пор Вы видели методы без параметров. Параметры используются для передачи некоторых данных методу, чтобы осуществить Ваш процесс как нельзя лучше. Например, Вы хотите перекрасить спальни. Вам нужно посоветоваться со всеми членами семьи, которые проживают с Вами в доме, по поводу цвета стен в спальнях. Вы можете задать имя пользователя и их любимый цвет в качестве параметра метода. public void BedRoom(String nameandColor) { Console.WriteLine(nameandColor); } Тот же самый метод с другими параметрами называется методом перегрузки. Пример метода Вы найдете ниже. Оба метода называются одинаково, но имеют разные параметры. public void BedRoom(String MemberName,String Color) { Console.WriteLine(MemberName + " Like " + Color + "Color"); } Пример законченного класса с основным методом: class ShanuHouseClass1 { int NoofChair = 0; public String YOURTVName; private Boolean DoyouHaveTV = true; public void veranda() { Console.WriteLine("Welcome to Veranda"); Console.WriteLine("How Many Chairs Do you have in your Veranda"); NoofChair = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda"); } public string TVNAME() { Console.WriteLine("Enter Your TV Brand NAME"); YOURTVName = Console.ReadLine(); return YOURTVName; } public void BedRoom(String nameandColor) { Console.WriteLine(nameandColor); } public void BedRoom(String MemberName,String Color) { Console.WriteLine(MemberName + " Like " + Color + "Color"); } static void Main(string[] args) { ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1(); objHouseOwner.veranda(); String returnvalue = objHouseOwner.TVNAME(); Console.WriteLine("Your TV BRAND NAME IS: "+returnvalue); objHouseOwner.BedRoom("My Name is Shanu I like Lavender color"); objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color"); objHouseOwner.BedRoom("SHANU", "Lavender"); Console.ReadLine(); } } 5. Модификаторы доступа Модификаторы доступа не что иное, как использование и ограничение типа значений переменных, методов и класса. Это можно назвать пределом безопасности. Шесть основных модификаторов доступа: частный публичный внутренний защищенный внутренний защищенный Частный модификатор доступа. Вернемся к примеру с домом. Охранник может охранять Ваш дом. Его обязанность - охранять вход в дом. Он не может зайти в дом и получить доступ ко всем вещам. Вы создаете SecurityGuardClass и называете переменную и метод для Security частным. Общественный модификатор доступа. Владельцы дома считаются общественными по отношению к классу. Они могут получить доступ ко всем классам, связанным с домом. Нет никаких ограничений на доступ к дому. Защищенный модификатор доступа. Только основной класс и производные классы могут иметь доступ к защищенным значениям переменных и методам. Например, служащие и гости – пример защищенного доступа. Служащие могут войти в любую комнату, прибраться там. Тем не менее, они имеют ограниченный доступ к дому, так как они не могут отдохнуть в постели хозяина дома. Внутренний модификатор доступа. Предел значения переменной или метода доступа существует в рамках проекта. Предположим, что в Вашем проекте существует более одного класса, и Вы объявили переменную в качестве внутреннего доступа в один класс. Посмотрите пример программы для внутренней переменной. public class sampleInternalClass { internal String myInternal = "Iam Internal Variable"; } class ShanuHouseClass { int noOfTV = 2; public String yourTVName = "SAMSUNG"; public void myFirstMethod() { Console.WriteLine("You Have total " + noOfTV + "no of TV :"); Console.WriteLine("Your TV Name is :" + yourTVName); } static void Main(string[] args) { ShanuHouseClass objHouseOwner = new ShanuHouseClass(); objHouseOwner.myFirstMethod(); sampleInternalClass intObj = new sampleInternalClass(); Console.WriteLine("Internal Variable Example :" + intObj.myInternal); Console.ReadLine(); } } Внутренний модификатор защиты. Внутреннее защищенное значение переменной или метод имеет свои ограничения в рамках проекта класса или производного класса. Вот пример программы для внутренней защищенной переменной. В этом примере использован механизм наследования. public class sampleProtectedInternalClass { protected internal String myprotectedInternal = "Iam Protected Internal Variable"; public void protectedInternalMethod() { Console.WriteLine("Protected Internal Variable Example :" + myprotectedInternal); } } public class derivedClass : sampleProtectedInternalClass { public void derivedprotectedInternal() { Console.WriteLine("Derived Protected Internal Variable Example :" + myprotectedInternal); } } class ShanuHouseClass { int noOfTV = 2; public String yourTVName = "SAMSUNG"; public void myFirstMethod() { Console.WriteLine("You Have total " + noOfTV + "no of TV :"); Console.WriteLine("Your TV Name is :" + yourTVName); } static void Main(string[] args) { ShanuHouseClass objHouseOwner = new ShanuHouseClass(); objHouseOwner.myFirstMethod(); sampleProtectedInternalClass intObj = new sampleProtectedInternalClass(); intObj.protectedInternalMethod(); derivedClass proIntObj = new derivedClass(); proIntObj.derivedprotectedInternal(); Console.ReadLine(); } } 6. Инкапсуляция Инкапсуляция скрывает элементы или значения переменных за пределами класса. Вы помните, что охранник не имеет права заходить в дом, он не должен быть в курсе того, что происходит в доме. Таким образом, для большей безопасности владелец дома скроет все, что происходит внутри, от охранника. Скрытие и ограничение называют инкапсуляцией. Например, у Вас есть два класса: первый называется "Houseclass" и другой – "houseSecurityClass". Вы видите значения переменных, спрятанных в классе, где "houseSecurityClass" – общественный, а "Houseclass" может получить доступ, но "Houseclass" имеет как общественные, так и частные значения переменной, в которой частное значение переменной класса не может быть доступным за пределами класса. public class houseSecurityClass { public int noofSecurity; public String SecurityName = String.Empty; } public class Houseclass { private int noofLockerinHosue = 2; public string OwnerName = String.Empty; } 7. Абстракция Абстракция показывает и делит общие данные с пользователем. Прислуга в доме может заходить во все комнаты и убираться там. Владелец дома может предоставить полные и частичные права слуге для доступа к его дому. Ниже приведен пример программы, в которой частные значения переменных и методов не согласуются со слугой, но общественная переменная и методы согласовываются. public class HouseServerntClass { private int SaftyLoackerKeyNo = 10001; public String roomCleanInstructions = "Clean All rooms"; private void saftyNos() { Console.WriteLine("My SaftyLoackerKeyNo is" + SaftyLoackerKeyNo); } public void roomCleanInstruction() { Console.WriteLine(roomCleanInstructions); } } 8. Наследование Наследование (подражание) используется для повторного использования кода. В защищенном внутреннем модификаторе доступа Вы уже видели пример программы наследования. Подражание - это не что иное, как доступ и использование всех базовых классовых значений переменных и методов в производном классе. Подражание может быть любым из следующих. Single level Inheritance: пример с одним базовым классом и одним производным public class baseClass { private void privateMethod() { Console.WriteLine("private Method"); } public void publicMethod() { Console.WriteLine("This Method Shared"); } } public class DerivedClass : baseClass { static void Main(string[] args) { DerivedClass obj = new DerivedClass(); obj.publicMethod(); Примечание: Базовый класс - высший класс, а производный класс - это класс (ы), который наследует базовый. Наследование, где базовый класс - "GuestVist", а производный класс - "HouseOwnerClass". В даном случае класс HouseOwnerClass наследует базовый класс GuestVist: class GuestVist { public void Guestwelcomemessage() { Console.WriteLine("Welcome to our Home"); } public void GuestName() { Console.WriteLine("Guest name is: Shanu"); } } class HouseOwnerClass : GuestVist { static void Main(string[] args) { HouseOwnerClass obj = new HouseOwnerClass(); obj.Guestwelcomemessage(); obj.GuestName(); Console.ReadLine(); } } Многозначное Наследование: рассмотрим пример с более чем одним производным классом. Первый базовый класс происходит с DerivedClass1, а затем DerivedClass1 возникает с DerivedClass2. Теперь с DerivedClass2 Вы можете получить доступ и к BaseClass, и DerivedClass1. public class baseClass { private void privateMethod() { Console.WriteLine("private Method"); } public void publicMethod() { Console.WriteLine("This Method Shared"); } } public class DerivedClass1 : baseClass { public void DerivedClass1() { Console.WriteLine("Derived Class 1"); } } public class DerivedClass2 : DerivedClass1 { static void Main(string[] args) { DerivedClass2 obj = new DerivedClass2(); obj.publicMethod(); obj.DerivedClass1(); } } Множественное наследование: Поддерживает ли .Net множественное наследование? Ответ на этот вопрос - нет. В C # невозможно использовать множественное наследование класса. Что такое множественное наследование? Множественное наследование имеет только один класс, и Вы можете наследовать оба класса в производном классе. Что произойдет, если ввести множественное наследование класса, используя C #? Вернемся к примеру с домом. Производный класс "HouseOwnerClass" с двумя дополнительными классами "GuestVist" и "FriendsandRelationsClass". Теперь предположим, что в Ваш дом пришел гость и друг. Для этого Вы вводите предыдущие три класса и наследуете два класса из Вашего производного класса. Если ввести множественное наследование в C #, на экране отразится предупреждение "Ожидание интерфейса" во время процесса кодирования и выполнения программы. 9. Полиморфизм Приставка «поли» означает больше, чем одна форма. В начале статьи в разделе выбор метода Вы уже видели пример полиморфизма. То же имя метода с другим параметром и есть примером полиморфизма. В полиморфизме используетс метод перегрузки и замещения. Полиморфизм имеет два способа выполнения программы: полиморфизм времени компиляции (Compile Time Polymorphism) и времени работы полиморфизма (Run time Polymorphism). Метод перегрузки. Метод перегрузки – тот же метод, используемый для более чем одного метода с другими аргументами. На примере ниже Вы видите, что имя метода «BedRoom» использовалось для двух методов, но параметры для каждого из них разные. class HouseOwnerClass { public void BedRoom(String nameandColor) { Console.WriteLine(nameandColor); } public void BedRoom(String MemberName, String Color) { Console.WriteLine(MemberName + " Like " + Color + "Color"); } static void Main(string[] args) { HouseOwnerClass objHouseOwner = new HouseOwnerClass(); objHouseOwner.BedRoom("My Name is Shanu I like Lavender color"); objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color"); objHouseOwner.BedRoom("SHANU", "Lavender"); Console.ReadLine(); } } Метод замещения. Разница между методом перезагрузки и замещения заключается в том, что при использовании метода перезагрузки Вы получите то же имя метода с другим аргументом. В методе замещения Вы получите то же имя метода, его параметры и тип, но метод замещения применим только к производным классам. Метод замещения не используется в одном и том же классе. Обратите внимание, как метод замещения можно использовать в абстрактном, виртуальном и недоступном методах. 10. Абстрактный класс/метод Абстрактный класс: у абстрактного класса ключевое слово abstract. abstract class GuestVist { } Абстрактный класс – наивысший класс для всех классов. Объект не может получить доступ к абстрактному классу. Вы не сможете создать объект для абстрактного класса. Что произойдет, если попробовать создать объект для абстрактного класса? Пытаясь создать объект для абстрактного класса, на экране появится предупреждение об ошибке "экземпляр абстрактного класса не может быть создан". Что произойдет, если создать абстрактный метод, который не будет замещен в производном классе? На примере ниже показан абстрактный метод, который не замещен в производном классе. На экране высветилось предупреждение, которое гласит, что класс должен быть внедрен в абстрактный класс. Вы видите абстрактный класс, который имеет обычный метод и абстрактный метод. У абстрактных методов нет содержания в абстрактном классе, поэтому Вы можете только объявить абстрактный метод в абстрактном классе. Должен быть как минимум один абстрактный метод в абстрактном классе. abstract class GuestVist { public void Guestwelcomemessage() { Console.WriteLine("Welcome to our AbstractHome"); } public void GuestName() { Console.WriteLine("Guest name is: Abstract"); } public abstract void purposeofVisit(); } public class Houseclass : GuestVist { static void Main(string[] args) { Houseclass objHouse = new Houseclass(); objHouse.Guestwelcomemessage(); } public override void purposeofVisit() { Console.WriteLine("Abstract just came for a Meetup and spend some time "); } } 11. Виртуальный класс/метод Виртуальный метод полезен для современного программирования. Что такое виртуальный метод и какая от него польза? Например, гость говорит, что сегодня еще 5 человек посетят Ваш дом. Для этого Вы пишете функцию для отображения сообщения, поскольку пять гостей посетят Ваш дом. После визита, Вы видите, что в общей сложности Ваш дом посетило 20 человек. Цифра может быть больше или меньше заявленной. В таком случае, у гостей будет свой отдельный класс, и дом станет этим отдельным классом. Разница между абстрактным и виртуальным методами Оба метода используют ключевое слово override. Абстрактный метод может использоваться только в абстрактном классе. Это значит, что в абстрактном методе абстрактного класса нет основы. А в виртуальном методе есть. На примере ниже показан абстрактный и виртуальный метод. В абстрактном классе, виртуальный метод отмечает пять гостей, но в программе производного класса количество было изменено на 20 гостей. Какой же будет результат в виртуальном методе? 5 или 20 гостей? abstract class GuestVist { public abstract void purposeofVisit(); // Abstract Method public virtual void NoofGuestwillvisit() // Virtual Method { Console.WriteLine("Total 5 Guest will Visit your Home"); } } class AbstractHouseClass : GuestVist { public override void purposeofVisit() // Abstract method Override { Console.WriteLine("Abstract just for a Meetup and spend some time "); } public override void NoofGuestwillvisit() // Virtual method override { Console.WriteLine("Total 20 Guest Visited our Home"); } static void Main(string[] args) { AbstractHouseClass objHouse = new AbstractHouseClass(); objHouse.purposeofVisit(); objHouse.NoofGuestwillvisit(); Console.ReadLine(); } } Завершенная программа abstract class GuestVist { public void Guestwelcomemessage() { Console.WriteLine("Welcome to our AbstractHome"); } public void GuestName() { Console.WriteLine("Guest name is: Abstract"); } public abstract void purposeofVisit(); // Abstract Method public virtual void NoofGuestwillvisit() // Virtual Method { Console.WriteLine("Total 5 Guest will Visit your Home"); } } class AbstractHouseClass : GuestVist { public override void purposeofVisit() // Abstract method Override { Console.WriteLine("Abstract just for a Meetup and spend some time "); } public override void NoofGuestwillvisit() // Virtual method override { Console.WriteLine("Total 20 Guest Visited our Home"); } static void Main(string[] args) { AbstractHouseClass objHouse = new AbstractHouseClass(); objHouse.Guestwelcomemessage(); objHouse.purposeofVisit(); objHouse.NoofGuestwillvisit(); Console.ReadLine(); } } 12. Недоступный класс/метод Недоступный класс: этот класс не может быть унаследован другими классами. Например, у владельца дома есть потайная комната, возможно, кабинет. Владелец не хочет, чтобы посторонние имели доступ к его кабинету. В таких случаях будет полезен недоступный класс. Недоступный класс вводится с помощью ключевого слова Sealed. Если класс объявлен Sealed, он не может быть унаследован другими производными классами. Что произойдет, если Вы унаследуете надоступный класс в производном классе? Рассмотрим пример ниже. Вы видите пример программы недоступного класса. public sealed class OwnerofficialRoom { public void AllMyPersonalItems() { Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me"); } } class HouseSealedClass { static void Main(string[] args) { OwnerofficialRoom obj = new OwnerofficialRoom(); obj.AllMyPersonalItems(); Console.ReadLine(); } } Недоступный метод: Если Вы объявили метод недоступным, то нельзя заместить определенный метод в производном классе. Давайте посмотрим Ваш класс дома, где есть базовый класс с виртуальным методом и виртуальным недоступным методом. Виртуальный метод может быть замещен в производном классе. Но виртуальный недоступный метод нельзя заместить в недоступном классе. public class OwnerOfficialroomwithrestriction { public virtual void message() { Console.WriteLine("Every one belongs to this house can access my items in my room except my sealed Item"); } public virtual sealed void myAccountsLoocker() { Console.WriteLine("This Loocker can not be inherited by other classes"); } } class HouseSealedClass : OwnerOfficialroomwithrestriction { public override void message() { Console.WriteLine("overrided in the derived class"); } public override void myAccountsLoocker() { Console.WriteLine("The sealed method Overrides"); } } 13. Статический класс/метод Статический класс и недоступный класс нельзя унаследовать. Разница между статическим и недоступным классами Можно создать объект (пример) недоступного класса. В секции недоступного класса создать образец недоступного класса, а в главном методе создать объект для доступа к недоступному классу. В недоступном классе можно прописать статические и нестатические методы. А для статического класса создать объект нельзя. В статическом классе допускаются только статические члены. То есть, в статическом классе нельзя прописать нестатические методы. В принципе, основной метод – пример статического метода. Когда Вы создадите консольное приложение в C #, увидите, что каждый класс имеет основной метод по умолчанию. Когда консоль или приложение Windows начинают выполняться, первым выполняется основной метод. Нет необходимости создавать объект основного метода, так как он был объявлен, как статический метод. В статическом классе память выделяется для всех статических переменных и методов во время выполнения, но для нестатических значений переменных и методов память выделяется только тогда, когда создается объект класса. Что произойдет, если ввести нестатических метод в статический класс? Вы увидите сообщение об ошибке: "Не удается создать экземпляр статического класса". Как вызвать статический класс метода и значение переменной, не создавая объект. Очень просто. Можно использовать "ClassName.Variable или Method Name", например, "OwnerofficialRoom.AllMyPersonalItems ();" Смотрите следующий пример со статическим классом: public static class OwnerofficialRoom { public static void AllMyPersonalItems() { Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me"); } } class HouseStaticClass { static void Main(string[] args) { OwnerofficialRoom.AllMyPersonalItems(); Console.ReadLine(); } } Результат предыдущей программы показан ниже: Можно ли создать статический метод в нестатическом классе? Да, можно создать статический метод в нестатическом классе. Нет необходимости создавать объект для доступа статического метода (ов) в нестатическом классе. Можно непосредственно использовать имя класса для доступа к статическому методу. Пример статического метода в нестатическом классе. public class OwnerofficialRoom { public static void AllMyPersonalItems() { Console.WriteLine("No need to create object for me just use my class name to access me :)"); } public void non_staticMethod() { Console.WriteLine("You need to create an Object to Access Me :("); } } class StaticmethodClass { static void Main(string[] args) { OwnerofficialRoom.AllMyPersonalItems(); OwnerofficialRoom obj = new OwnerofficialRoom(); obj.non_staticMethod(); Console.ReadLine(); } } 14. Интерфейс Интерфейс похож на абстрактный класс, но в интерфейсе существует только имя метода. Однако, в абстрактном классе можно иметь метод объявления и определения. Методы интерфейса должны быть реализованы в примененном классе. Смотрите следующий пример программы для интерфейса. Все методы интерфейса были реализованы в классе. Как уже было отмечено, С # не поддерживает множественное наследование. Чтобы получить множественное наследование, можно использовать интерфейс. Следующая программа – пример множественного наследования с использованием интерфейса. interface GuestInterface { void GuestWelcomeMessage(); void NoofGuestes(); } interface FriendsandRelationsInterface { void friendwelcomemessage(); void FriendName(); } class HouseOwnerClass : GuestInterface, FriendsandRelationsInterface { public void GuestWelcomeMessage() { Console.WriteLine("All guests are well come to our home"); } public void NoofGuestes() { Console.WriteLine("Total 15 Guestes has visited"); } public void friendwelcomemessage() { Console.WriteLine("Welcome to our Home"); } public void FriendName() { Console.WriteLine("Friend name is: Afraz"); } static void Main(string[] args) { HouseOwnerClass obj = new HouseOwnerClass(); obj.GuestWelcomeMessage(); obj.NoofGuestes(); obj.friendwelcomemessage(); obj.FriendName(); Console.ReadLine(); } } Иногда необходимо иметь определенные методы, которые будут использоваться во многих производных классах. Каждый производный класс может выполнять различные функции для этих методов. В таких случаях можно использовать интерфейс. Проведем аналогию с гостями, которые посещают Ваш дом. Предположим, для гостей разослали два типа сообщений: "Добро пожаловать" и "Вход для гостей запрещен". Функции являются общими, но разнятся для каждого владельца в одном и том же доме. Гость может быть гостем отца, матери, детей или всей семьи. У каждого гостя свое сообщение-приглашение, но функции те же, что в сообщении. Отец – это класс, мать – класс и дети – один класс. Оба сообщения для гостей «Добро пожаловать» и «Вход для гостей запрещен" – одинаковы для всех. В этом случае, можно создать интерфейс и объявить оба метода в интерфейсе. Классы отца, матери и детей могут наследовать интерфейс и вводить собственные детали метода. Интерфейс похож на абстрактный класс, но главное отличие между абстрактным классом и интерфейсом в том, что в абстрактном классе есть абстрактный и неабстрактный методы. Но по умолчанию в интерфейсе все методы являются абстрактными. Поэтому в интерфейсе нет неабстрактного метода. Все методы, объявленные в интерфейсе, должны быть замещены в производном классе. Что произойдет, если объявить неабстрактные методы в интерфейсе? Вы увидете предупреждение "неожиданный модификатор" в модификаторе доступа и "неожиданное содержание метода" в тексте сообщения. Пример программы для интерфейса: interface GuestInterface { void GuestWelcomeMessage(); void NoofGuestes(); } class HouseOwnerClass: GuestInterface { public void GuestWelcomeMessage() { Console.WriteLine("All guests are well come to our home"); } public void NoofGuestes() { Console.WriteLine("Total 15 Guestes has visited"); } static void Main(string[] args) { HouseOwnerClass obj = new HouseOwnerClass(); obj.GuestWelcomeMessage(); obj.NoofGuestes(); Console.ReadLine(); } } СОВРЕМЕННЫЕ ТЕХНОЛОГИИ РАЗРАБОТКИ ПРОГРАММНЫХ ПРОДУКТОВ Аспектно-ориентированное программирование программных средств |