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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

 

3.5 Мусорная корзина

 

Если  вы создали и использовали объект, вам нужно уничтожить его, чтобы  не занимать неиспользуемую память.

C++: В C++ уничтожить объект, расположенный в стеке, довольно просто. С другой стороны, уничтожение объектов, созданных динамически, зачастую является сложной проблемой. Есть много решений, включая подсчет ссылок и "интеллектуальные" указатели, но ни один из них не даёт простого решения. Первое впечатление для C++ программистов, что использование ссылочно-объектной модели сделает ситуацию только хуже.

Java: Это, конечно, не касается Java, так как виртуальная машина запускает алгоритм сборки мусора (в фоновом процессе, согласно теории Java; или начинает этот процесс после того, как ненадолго остановит программу, как в большинстве реальных JVM). Сбор мусора происходит без участия программиста, но он может неблагоприятно влиять на эффективность выполнения приложения. Отсутствие явно записываемых деструкторов может приводить к ошибкам в завершающем коде.

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

 

3.6 Определение новых классов

 

Класс — это просто набор методов, работающих с определёнными локальными данными.

C++:  Синтаксис определения простого класса:

  class Date {

private:

  int dd;

  int mm;

  int yy;

public:

  void Init (int d, int m, int y);

  int Day ();

  int Month ();

  int Year ();

  };

Определение одного из методов:

  void Date::Init (int d, int m, int y)

{

  dd = d;

  mm = m;

  yy = y;

}

Java: Синтаксис Java очень похож на синтаксис C++:

  class Date {

  int dd = 1;

  int mm = 1;

  int yy = 1;

  public void Init (int d, int m, int y) {

    dd = d; mm = m; yy = y;}

  public int Day () {return dd;}

  public int Month () {return mm;}

  public int Year () {return yy;}

  }

Основная  разница состоит в том, что  код каждого метода пишется там  же, где он объявляется (при этом функции не становятся вставными (inline), как в C++), и в том, что вы можете инициализировать элементы данных класса. Фактически, если вы не сделаете этого, то Java проинициализирует все элементы данных за вас, используя значения по умолчанию.

Object Pascal: В Object Pascal синтаксис определения класса другой, но похожий скорее на C++, чем на Java:

  type

  Date = class

  private

    dd, mm, yy: Integer;

  public

    procedure Init (d, m, y: Integer);

    function Month: Integer;

    function Day: Integer;

    function Year: Integer;

  end;

procedure Date.Init (d, m, y: Integer);

begin

  dd := d;

  mm := m;

  yy := y;

end;

 

function Date.Day: Integer;

  begin

  Result := dd;

end;

Здесь есть синтаксические отличия: методы определяются с ключевыми словами function и procedure, методы без параметров не используют скобок, методы просто объявляются  внутри определения класса, тогда  как определяются позже, как это  обычно делается в C++. Однако Pascal использует нотацию с точкой, а C++ — оператор :: (недоступный в Object Pascal и Java).

Примечание: Доступ к текущему объекту. В ОО языках методы отличаются от глобальных функций  тем, что у них присутствует скрытый  параметр, ссылка или указатель на объект, с которым мы работаем. Просто эта ссылка на текущий объект по-разному  называется. Это this в C++ и Java, Self в Object Pascal.

 

 

 

 

 

 

 

3.7 Создание и уничтожение объектов

 

Конструкторы

 

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

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

Object Pascal: В Object Pascal вы используете специальное ключевое слово constructor и можете дать конструктору любое имя. Хотя Borland в Delphi 4 добавила поддержку перегрузки методов, программисты всё ещё дают разным конструкторам разные имена. В Object Pascal у каждого класса по умолчанию есть конструктор Create (наследуемый от TObject), если вы не перегрузите его конструктором с тем же именем и, возможно, другими параметрами. Этот конструктор, как мы увидим позднее, просто наследуется от общего базового класса)

 

Деструкторы и финализация

 

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

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

Java: В Java нет деструкторов. Объекты, на которые нет ссылок, уничтожаются сборщиком мусора, который работает в виде фоновой задачи и делает это автоматически (как описывалось ранее). Прежде чем уничтожать объект, сборщик мусора должен вызвать метод finalize(). Однако нет никакой гарантии, что этот метод вызывается в каждой JVM. По этой причине, если вам нужно освободить ресурсы, вы должны добавить какой-нибудь метод, и убедиться, что он вызывается (эти дополнительные усилия не нужны в других ОО языках).

Object Pascal:  деструкторы похожи на деструкторы C++ (Для деструкторов используется ключевое слово destructor). Object Pascal использует стандартный виртуальный деструктор, называемый Destroy. Этот деструктор вызывается стандартным методом Free. Все объекты динамические, поэтому предполагается, что вы вызовете Free для каждого объекта, созданного вами, если у того нет владельца, отвечающего за его уничтожение. Теоретически вы можете объявить несколько деструкторов, что имеет смысл, если вы можете вызывать деструкторы в своем коде (это не делается автоматически).

 

 

 

 

    1. Инкапсуляция (Private и Public)

 

Общим элементом всех трех языков является присутствие трех спецификаторов доступа, указывающих на различные уровни инкапсуляции класса: public, protected, и private. Public означает: видимый любым другим классом, protected означает: видимый производными классами, private означает: отсутствие видимости  извне. В деталях, однако, есть различия.

C++: В C++ вы можете использовать ключевое слово friend для обхода инкапсуляции. Видимость по умолчанию для класса — private, для структур — public.

Java: В Java отличие синтаксиса в том, что модификатор доступа повторяется для каждого элемента класса. А конкретнее, по умолчанию в Java используется friendly, это значит, что элемент видим для других классов этого же пакета (или файла исходного кода, как в OP). Подобным образом, protected означает видимость для подклассов, тогда как комбинация private protected соответствует protected в C++.

Object Pascal: В Object Pascal private и protected относятся только к классам других юнитов. В терминах C++, класс является дружественным для любого другого класса, определенного в том же юните (или файле исходного кода). В Delphi есть еще один модификатор доступа — published, который генерирует информацию времени выполнения (RTTI) об элементах.

 

      1. Файлы, юниты и пакеты

 

Важное  различие между тремя языками  заключается в организации исходного  кода в файлах. Все три языка  используют файлы в качестве стандартного механизма для запоминания исходного  кода классов (в отличие от других ОО языков, таких как Smalltalk), но компилятор C++, в отличие от OP или Java, не понимает файлов. Эти же два языка работают с идеей модулей, хотя называют их по-разному.

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

Java: В Java каждый файл исходного кода или единица компиляции компилируется отдельно. Затем вы можете отметить группу единиц компиляции как части одного пакета. В отличие от двух других языков, вы пишете весь код методов тут же при объявлении класса. При включении какого-либо файла предложением import, компилятор читает только public объявления, а не весь код:

import where.myclass;

import where.* // все классы

Object Pascal: В Object Pascal каждый файл исходного кода называется unit, и он делится на две части: интерфейс и исполнение, отмечаемые соответственно ключевыми словами interface и implementation. Секция интерфейса включает в себя определения классов (с объявлениями методов), а секция исполнения должна включать в себя определения методов, объявленных в интерфейсе. Писать фактический код в секции интерфейса нельзя. Вы можете сослаться на объявления другого файла, используя предложение uses. Этим включается в компиляцию интерфейс того файла:

uses

Windows, Form, MyFile;

Модули  как пространство имён. Важным отличием Java и Object Pascal является их способность  читать откомпилированные файлы  и извлекать из них определения, как бы извлекая заголовки из скомпилированного кода. С другой стороны, для преодоления отсутствия модулей C++ включает пространство имен (namespace). В Java и OP, когда два имени конфликтуют, вы можете просто использовать имя модуля в качестве префикса. Это не требует дополнительной работы по определению пространств имен, а просто включено в языки.

 

      1.  Методы/данные класса и объекта класса

 

ОО  языки обычно разрешают заводить методы и данные, относящиеся к  классу целиком, а не к отдельным  объектам. Метод класса обычно может  быть вызван как для объекта класса, так и применён к классу в целом. Данные класса не повторяются для  каждого объекта, а разделяются  между всеми объектами данного  типа.

C++: В C++ методы и данные класса отмечаются ключевым словом static. Данные класса должны быть проинициализированы специальным объявлением, ещё одной уступкой отсутствию модулей.

Java: Java использует то же слово, что и C++, static. Статические методы используются очень часто (и даже слишком) из-за отсутствия глобальных функций. Статические данные можно инициализировать прямо в объявлении класса.

Object Pascal: В Object Pascal допустимы только методы класса, которые отмечаются словом class. Данные класса можно заменить, так сказать, приватными глобальными переменными в секции исполнения юнита, описывающего класс.

 

3.11 Классы и наследование

 

Наследование  у классов — одно из оснований  ООП. Оно может быть использовано для выражения генерализации  или специализации. Основная идея в  том, что вы определяете новый  тип, расширяя или модифицируя существующий, другими словами, производный класс  обладает всеми данными и методами базового класса, новыми данными и  методами и, возможно, модифицирует некоторые  из существующих методов. Различные  ОО языки используют различные жаргоны  для описания этого механизма (derivation, inheritance, sub-classing), для класса, от которого вы наследуете (базовый класс, родительский класс, суперкласс) и для нового класса (производный класс, дочерний класс, подкласс).

C++: C++ использует слова public, protected, и private для определения типа наследования и чтобы спрятать наследуемые методы или данные, делая их приватными или защищёнными. Хотя публичное наследование наиболее часто используется, по умолчанию берётся приватное. Как мы увидим далее, C++ — единственный из этих трех языков, поддерживающий множественное наследование. Вот пример синтаксиса наследования:

class Dog: public Animal {

...

};

Java: Java использует слово extends для выражения единственного типа наследования, соответствующего публичному наследованию в C++. Java не поддерживает множественное наследование. Классы Java тоже происходят от общего базового класса.

class Dog extends Animal {

...

}

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

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