Объектно-ориентированное программирование

Автор работы: Пользователь скрыл имя, 26 Сентября 2013 в 21:40, курсовая работа

Краткое описание

В работе рассматриваются три вопроса. В первом мы анализируем устройства ввода звуковой информации, их виды и назначение. При ответе на второй вопрос мы узнаем об организации файловой системы, как обслуживается файловая структура . В третьем вопросе мы рассматриваем объектно-ориентированное программирование в языках С++, Object Pascal, Java, узнаём о предназначении и структуре.
Современный период развития общества характеризуется сильным влиянием на него компьютерных технологий. Средства ввода звуковой информации на компьютер совершенствуются. Объектно-ориентированное программирование – это новый способ подхода к программированию

Содержание

Введение……………..……………………….…………….……………………….…...…..4
1. Устройства ввода звуковой информации.…………………………………………....5
1.1 Микрофон……...…………..………………………..………………………………..5
1.2 Цифровой диктофон.…………………………………………………………….…7
1.3 Модем…………………………………………………………………………………..7
2. Организация файловой системы. Обслуживание файловой структуры…………......10
2.1 Организация файловой системы.…………………………….…………….… ... 10
2.2 Обслуживание файловой структуры…………………………….….…….…….21
3. Объектно-ориентированное программирование…….……………………………..…....24
3.1 Контроль во время компиляции и во время выполнения………………….……25
3.2 Чисто объектно-ориентированные и гибридные языки……………………..25
3.3 Простая объектная модель и ссылочно-объектная модель…………………26
3.4 Классы, объекты и ссылки………………………………………………………….26
3.5 Мусорная корзина…………………………………………………………………….27
3.6 Определение новых классов…………………………………………………………29
3.7 Создание и уничтожение объектов ……………………………………………..30
3.8 Инкапсуляция (Private и Public)……………………………………………………30
3.9 Файлы, юниты и пакеты……………………………………………………………30
3.10 Методы/данные класса и объекта класса……………………………………..31
3.11 Классы и наследование……………………………………………………………..31
3.12 Предок всех классов…………………………………………………………………32
3.13 Доступ к методам базового класса……………………………………………..32
3.14 Совместимость подтипов………………………………………………………..33
3.15 Позднее связывание (и полиморфизм)…………………………………………..33
3.16 Абстрактные методы и классы…………………………………………………33
3.17 Множественное наследование и интерфейсы…………..……………………34
3.18 Другие свойства…………………………………………………………….………35
3.19 Стандарты…………………………………………………………………….……37
3.20 Языки и программное окружение……………………………………………...37
4. Практическая часть ……………………….…………………………...……………38
4.1 Условие задачи…………………………………………………………….…………38
4.2 Блок-схема………………………………………………….…………………………39
4.3 Листинг программы…………………………………………………………………40
Заключение ……………….……….………………………………………………………42
Список использованной литературы…………………………………………………… 43

Вложенные файлы: 1 файл

курсяк.docx

— 942.17 Кб (Скачать файл)

type

Dog = class (Animal)

...

end;

Конструкторы  и инициализация базового класса и в C++, и в Java у конструкторов  наследующих классов сложная  структура. В Object Pascal за инициализацию  базового объекта отвечает программист.

3.12 Предок всех классов

 

В некоторых ОО языках каждый класс  происходит по крайней мере от некоторого базового класса по умолчанию. Этот класс, часто называемый Object, или подобно  этому, обладает некоторыми основными  способностями, доступными всем классам. Фактически, все другие классы в  обязательном порядке его наследуют. Этот подход является общим ещё и  потому, что так первоначально  делалось в Smalltalk.

C++: Хотя язык C++ и не поддерживает такое свойство, многие структуры приложений базируются на нём, вводя идею общего базового класса. Пример тому — MFC с его классом COobject. Фактически это имело большой смысл вначале, когда языку не хватало шаблонов.

Object Pascal: Каждый класс автоматически наследует класс TObject. Так как язык не поддерживает множественное наследование, все классы формируют гигантское иерархическое дерево. Класс TObject поддерживает RTTI и обладает некоторыми другими возможностями. Общей практикой является использование этого класса, когда вам нужно передать объект неизвестного типа.

Java: Как и в OP, все классы безоговорочно наследуют класс Object. И в этом языке у общего класса тоже есть некоторые ограниченные свойства и небольшая поддержка RTTI.

 

3.13 Доступ к методам базового класса

 

При написании метода класса или перекрывании метода базового класса, нередко приходится ссылаться на методы базового класса. Если этот метод переопределен в  производном классе, то, используя  его имя, получаем новую версию. В  ОО языках есть некоторые приёмы или  ключевые слова, позволяющие решить эту проблему.

C++: В C++ для указания нужного класса можно использовать оператор (::). Вы можете получить доступ не только к методам базового класса, но к классам выше по иерархии. Это очень мощная техника, но она создаёт проблемы, когда вы добавляете в иерархию промежуточный класс.

Object Pascal: В Object Pascal для этой цели есть специальное слово inherited. После этого слова вы можете написать имя метода базового класса или (в некоторых случаях) просто использовать это ключевое слово для доступа к соответствующему методу базового класса.

Java: Java для этого использует ключевое слово super. В этом языке, так же, как и в OP, нет возможности сослаться на другой предшествующий класс. На первый взгляд, это может показаться ограничением, но оно позволяет расширять иерархию, вводя промежуточные классы. К тому же, если вы не нуждаетесь в функциях базового класса, вам, наверное, не следовало ему наследовать.

 

 

 

 

 

 

3.14 Совместимость подтипов

 

Не  все ОО языки строго типизированы, но все три языка, на которых мы сконцентрировались, обладают этим свойством. В основном это означает, что объекты  различных классов несовместимы по типу. Из этого правила есть исключение: объекты производных классов  совместимы с типом их базового класса. (обратное обычно неверно.)

C++: В C++ правило совместимости подтипов справедливо только для указателей и ссылок, но не для обычных объектов. Фактически, у различных объектов разный размер, поэтому их нельзя расположить на том же месте в памяти.

Object Pascal: Благодаря ссылочно-объектной модели, совместимость подтипов возможна для каждого объекта. Более того, все объекты совместимы по типу с TObject.

Java: Java использует ту же модель, что и Object Pascal.

Совместимость подтипов особенно важна для позднего связывания и полиморфизма.

 

3.15 Позднее связывание (и полиморфизм)

 

Когда различные классы в иерархии переопределяют некоторый метод, очень полезна  возможность ссылаться на общий  объект этих классов (благодаря совместимости  подклассов) и вызывать этот метод, результатом чего будет вызов  метода надлежащего класса. Для этого  компилятор должен поддерживать позднее  связывание, то есть не генерировать вызов  специфической функции, а ждать, пока во время выполнения не определятся  фактический тип объекта и  функция, которую нужно вызвать.

C++: В C++ позднее связывание доступно только для виртуальных методов (вызов которых становится немного медленнее). Метод, объявленный в базовом классе как виртуальный (virtual), поддерживает это свойство (но только если описания методов совпадают). Обычные, не виртуальные методы не позволяют позднее связывание, как и OP.

OP: В Object Pascal позднее связывание вводится с помощью ключевых слов virtual и dynamic (разница между ними только в оптимизации). В производных классах переопределённые методы должны быть отмечены словом override (это заставляет компилятор проверять описание метода). Рациональное объяснение этой особенности OP состоит в том, что разрешается больше изменений в базовом классе и предоставляет некоторый дополнительный контроль во время компиляции.

Java: В Java все методы используют позднее связывание, если вы не отметите их явно как final. Финальные методы не могут быть переопределены и вызываются быстрее. В Java написание методов с нужной сигнатурой жизненно важно для обеспечения полиморфизма. Тот факт, что в Java по умолчанию используется позднее связывание, тогда как в C++ стандартом является раннее связывание, — явный признак разного подхода этих двух языков: C++ временами жертвует ОО моделью в пользу эффективности, тогда как Java — наоборот.

Object Pascal, в отличие от других двух  языков, позволяет определять виртуальные  конструкторы. Все три языка поддерживают  виртуальные деструкторы.

 

3.16 Абстрактные методы и классы

 

При построении сложной иерархии, для  обеспечения полиморфизма программисты часто вынуждены вводить методы в классы верхнего уровня, даже если эти методы ещё не определены для  этой специфической абстракции. Здесь  можно было бы оставить пустые методы, но многие ОО языки предлагают такой  специфический механизм, как определение  абстрактных методов, то есть методов  без реализации. Классы, имеющие  хотя бы один абстрактный метод, часто  называется абстрактным классом.

C++: В C++ абстрактные методы или чисто виртуальные функции получаются добавлением так называемого чистого описателя (=0) в определение метода. Абстрактные классы являются просто классами с одним или более абстрактным методом (или наследующие их).

OP: Object Pascal для выделения этих методов использует ключевое слово abstract. Кроме того, абстрактными классами являются классы, имеющие или наследующие абстрактные методы. Вы можете создать объект абстрактного класса (хотя компилятор выдаст предупреждающее сообщение). Это подвергает программу риску вызвать абстрактный метод, что приведёт к генерации ошибки времени выполнения и завершению программы.

Java: В Java и абстрактные методы, и абстрактные классы отмечаются ключевым словом abstract (действительно, в Java обязательно определять как абстрактный класс, имеющий абстрактные методы, — хотя это кажется некоторым излишеством). Производные классы, которые не переопределяют все абстрактные методы, должны быть отмечены как абстрактные. Как и в C++, нельзя создавать объекты абстрактных классов.

 

3.17 Множественное наследование и интерфейсы

 

Некоторые ОО языки допускают наследование более чем одному базовому классу. Другие языки позволяют вам наследовать  только от одного класса, но дополнительно  позволять вам наследовать также  от многочисленных интерфейсов или  чисто абстрактных классов, то есть классов, состоящих только из виртуальных  функций.

C++: C++ — единственный из трех языков, поддерживающий множественное наследование. Некоторые программисты считают положительным фактом, другие — отрицательным. Определенно, что множественное и повторяющееся наследование влечет за собой такие понятия, как виртуальные базовые классы, которые не легко освоить, хотя они предоставляют мощную технику. C++ не поддерживает понятия интерфейсов, хотя их можно заменить множественным наследованием чисто абстрактным классам (интерфейсы можно рассматривать как подмножество множественного наследования).

Java: Java, как и Object Pascal, не поддерживает множественное наследование, но полностью поддерживает интерфейсы. Методы интерфейсов допускают полиморфизм, и Вы можете использовать объект, осуществляющий интерфейс, когда ожидается интерфейсный объект. Класс может наследовать или расширить один базовый класс, но может осуществить (это — ключевое слово) многочисленные интерфейсы. Хотя это не было спланировано заранее, интерфейсы Java очень хорошо укладываются в модель COM. Вот пример интерфейса:

public interface CanFly {

public void Fly();

}

public class Bat extends Animal implements CanFly {

public void Fly() {// the bat flies...}

}

 

OP: Delphi 3 ввел в Object Pascal понятие, подобное интерфейсам Java, но эти интерфейсы строго соответствуют COM (хотя технически возможно использовать их в обычных не-COM программах). Интерфейсы формируют иерархию, отдельную от классов, но, как и в Java, класс может наследовать одному базовому классу и осуществлять различные интерфейсы. Отображение методов класса на методы интерфейсов, осуществляемых классом, является одной из наиболее сложных частей языка Object Pascal. Delphi 4 добавляет к этой структуре возможность передать реализацию интерфейса подобъекту, делая эту технику почти такой же эффективной, как и множественное наследование.

 

3.18 Другие свойства

 

Помимо  обеспечения объектно-ориентированного программирования, эти языки предлагают другие интересные и мощные характеристики, которые дополняют поддержку  ООП.

RTTI

 

В строго типизованных ОО языках компилятор осуществляет весь контроль типов, так  что нет особой необходимости  хранить информацию о классах  и типах в работающей программе. Тем не менее, есть случаи (как, например, динамическое преобразование типов), которые  требуют информацию о типе. По этой причине все три ОО языка, рассматриваемые  здесь, более или менее поддерживают Идентификацию/Информацию о Типе Времени  Выполнения (RTTI).

C++: первоначально не поддерживал RTTI. Это было добавлено позже для динамического преобразования типа (dynamic_cast) и сделало доступной некоторую информацию о типе для классов. Вы можете запросить идентификацию типа для объекта, и проверить, принадлежат ли два объекта одному классу.

OP: поддерживает и требует много RTTI. Доступен не только контроль соответствия и динамическое преобразование типов (с помощью операторов is и as). Классы генерируют расширенную RTTI для своих published свойств, методов и полей. Фактически это ключевое слово управляет частью генерации RTTI. Вся идея свойств, механизм потоков (файлы форм — DFM), и среда Delphi, начиная с Инспектора Объектов, сильно опирается на RTTI классов. У класса TObject есть (кроме прочих) методы ClassName и ClassType. ClassType возвращает переменную типа класса, объект специального типа ссылки на класс (который не является самим классом).

Java: как и в Object Pascal, в Java тоже есть единый базовый класс, помогающий следить за информацией о классе. Безопасное преобразование типов (type-safe downcast) встроено в этот язык. Метод getClass() возвращает своего рода метакласс (объект класса, описывающего классы), и Вы можете применить функцию getName() для того, чтобы получить строку с именем класса. Вы можете также использовать оператор instanceof. Java включает в себя расширенную RTTI для классов или интроспекцию, которая была введена для поддержки компонентной модели JavaBeans. В Java существует возможность создавать классы во время исполнения программы.

Пример: Синтаксис безопасного преобразования типов на всех трех языках. В случае ошибки в Delphi и Java происходит исключение, а в С++ возвращается нулевой указатель:

// C++

Dog* MyDog = dynamic_cast <Dog*> (myAnimal);

// Java

Dog MyDog = (Dog) myAnimal;

// Object Pascal

myDog := myAnimal as Dog;

 

Обработка исключений

 

Основная  идея обработки исключений — упростить  код обработки ошибок в программе, предоставив стандартный встроенный механизм, с целью сделать программы  более устойчивыми.

C++: C++ использует ключевое слово throw для генерации исключения, try для отметки охраняемого блока и catch для записи кода обработки исключения. Исключения — объекты специального класса, которые могут образовывать некоторую иерархию во всех трёх языках. При возникновении исключения C++ выполняет очистку стека до точки перехвата исключения. Перед удалением каждого объекта в стеке вызывается соответствующий деструктор.

OP: Object Pascal использует подобные ключевые слова: raise, try, и except и обладает подобными свойствами. Единственное существенное отличие состоит в том, что опустошение стека не производится, просто потому, что в стеке нет объектов. Кроме того, вы можете добавить в конце блока try слово finally, отмечая блок, который должен выполняться всегда, независимо от того, было или нет вызвано исключение. В Delphi классы исключений — производные Exception.

Java: Использует ключевые слова C++, но ведёт себя как Object Pascal, включая дополнительное ключевое слово finally. (Это общее свойство всех языков со ссылочно-объектной моделью, оно включено Borland также и в C++Builder 3.) Присутствие алгоритма сборки мусора ограничивает использование finally в классе, который распределяет другие ресурсы, кроме памяти. Также Java строже требует, чтобы все функции, которые могут вызвать исключение, описывали в соответствующем блоке, какие исключения могут быть вызваны функцией. Эти описания исключений проверяются компилятором, что является хорошим свойством, даже если оно подразумевает некоторую дополнительную работу для программиста. В классах Java объекты-исключения должны наследовать классу Throwable.

Информация о работе Объектно-ориентированное программирование