Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 22:14:57
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

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


Содержание курса

Первый калькулятор - арифмометр

Шаг 6. "Пять классов математики" или введение в объектно-ориентированное программирование.

Этот шаг – краткий экскурс в объектно-ориентированное программирование (ООП). Перед тем как начать знакомиться с приведенными ниже примерами, рекомендую пройти по ссылке и кратко познакомиться с этим направлением в программировании. Про ООП написано очень много всякой разной литературы. Тема эта настолько популярна, насколько и гениальна, поэтому представить свое мнение об объектно-ориентированной парадигме считает своим долгом практически каждый автор книг о программировании.

На сайте Coding Craft более подробно рассматривается тема классов, наследования и полиморфизма в разделах курса программирования C# Quick Guide™. В рамках курса основ программирования в целом и этого шага в частности я ни в коем случае не ставлю задачи научить читателя всем тонкостям и хитростям объектно-ориентированного программирования, но ввести в курс дела, надеюсь, у меня получится. Считаю, что не стоит уделять излишнего внимания приводимым в примере синтаксическим конструкциям - вполне достаточно уловить их смысл. Речь пойдет о пяти бинарных математических операциях: сложение, вычитание, умножение, деление и возведение в степень. Их всех объединяет то, что они принимают два вещественных аргумента и возвращают одно вещественное число в качестве результата.

Описание реализации

Пример, приведенный ниже, с одной стороны довольно прост, но с другой – демонстрирует практически все преимущества объектно-ориентированного программирования:

  • Применение абстрактных типов, как способа выделения наиболее значимых аспектов описываемых объектов. С помощью введения абстрактного класса MathOperation и абстрактной функции Calculate мы выделяем “бинарность” наших операций, как их общее, наиболее значимое в текущем контексте свойство. Абстрактные классы на то и абстрактные, что нельзя создавать их экземпляры, а абстрактные функции и методы не имеют своей реализации. Одно из назначений абстрактных типов – наложение ограничений на производные от них типы. Одним из таких ограничений является обязательство всех производных от MathOperation классов реализовать функцию Calculate(). Реализовать именно в том виде, в котором она описана в базовом абстрактном классе, но логику операции определить самостоятельно.

  • Наследование, как способ выделения общей функциональности описываемых объектов в базовом типе. В нашем случае базовый класс MathOperation за все свои производные классы определяет то, как будет выводиться результат математической операции: реализует метод WriteResult(). Обратите внимание, что реализация метода WriteResult() ссылается на абстрактную функцию Calculate(), реализация которой может появиться только в производных от MathOperation классах. Таким образом, MathOperation определяет общее поведение метода, а его нюансы будут уточнены производными классами.

  • Полиморфизм, как способ одинаково обращаться к экземплярам наших математических операций, но получать от каждого из них уникальный результат. Классы Addition, Subtraction, Multiplication, Division и Power реализуют одну и ту же функцию Calculate(), которая им досталась по наследству от их общего предка – класса MathOperation, но каждый из них делает это по-своему.

Фрагмент кода

Код приводимого примера достаточно объемный, поэтому здесь представлен только базовый абстрактный класс MathOperation и один из производных классов – класс Addition. То, как создаются и используются экземпляры этих классов показано чуть ниже. Чтобы посмотреть исходный код всех классов и увидеть, как он работает, скачайте полные версии программ и запустите их с использованием обучающего приложения.

C#:
//Абстрактный класс 'Математическая операция'
public abstract class MathOperation
{
    //Обозначение операции
    private string m_Expression;
    public MathOperation(string _Expression) { m_Expression = _Expression; }

    //Статический метод - для вызова создавать экземпляр класса не требуется)
    //Ввод значения вещественного аргумента
    public static double assign(string _name)
    {
        Console.Write("Введите значение аргумента " + _name + " = ");

        try
        {
            return System.Convert.ToDouble(Console.ReadLine());
        }
        catch (Exception ex)
        {
            Console.WriteLine("Произошла ошибка ввода: " + ex.Message);
            throw;
        }
    }

    //Абстрактный метод - реализация возможна только в производном классе
    //Вычисление результата
    public abstract double Calculate(double a, double b);

    //Вывод результата на консоль
    public void WriteResult(double a, double b)
    {
        Console.WriteLine(a.ToString() + m_Expression + b.ToString() + "=" + this.Calculate(a, b).ToString());
    }
}

//Сложение
public class Addition : MathOperation
{
    public Addition() : base("+") { }
    public override double Calculate(double a, double b)
    {
        return a + b;
    }
}
VB.NET:
'Абстрактный класс 'Математическая операция'
Public MustInherit Class MathOperation
    Private m_Expression As String

    Public Sub New(ByVal _Expression As String)
        m_Expression = _Expression
    End Sub

    Public Shared Function Assign(ByVal _Name As String) As Double
        Console.Write("Введите значение аргумента " + _Name + " = ")

        Try
            Return System.Convert.ToDouble(Console.ReadLine())
        Catch ex As Exception
            Console.WriteLine("Произошла ошибка ввода: " + ex.Message)
            Throw
        End Try
    End Function

    'Абстрактный метод - реализация возможна только в производном классе
    'Вычисление результата
    Public MustOverride Function Calculate(ByVal a As Double, ByVal b As Double) As Double

    'Вывод результата на консоль
    Public Sub WriteResult(ByVal a As Double, ByVal b As Double)
        Console.WriteLine(a.ToString() + m_Expression + b.ToString() + "=" + Me.Calculate(a, b).ToString())
    End Sub
End Class

'Сложение
Public Class Addition
    Inherits MathOperation

    Public Sub New()
        MyBase.New("+")
    End Sub

    Public Overrides Function Calculate(ByVal a As Double, ByVal b As Double) As Double
        Return a + b
    End Function
End Class

Полные версии программы

На языке C#.
На языке VB.NET.

Важно: В классе MathOperation функция assign() определена, как статическая (static в C# и Shared в VB.NET). Это сделано для того, чтобы вызывать метод, не создавая экземпляров класса, а обращаясь к нему через имя типа. В нашем примере значения аргументов a и b общие для всех операций, а код самого ввода аргумента хотелось вынести в базовый тип. Вызов метода assign() расположен в функции Main(), исходный код которой представлен ниже.

C#:
public static void Main()
{
    double a = MathOperation.assign("a");
    double b = MathOperation.assign("b");

    List<MathOperation> _operations = new List<MathOperation>();
    _operations.Add(new Addition());
    _operations.Add(new Subtraction());
    _operations.Add(new Multiplication());
    _operations.Add(new Division());
    _operations.Add(new Power());

    foreach (MathOperation _operation in _operations)
        _operation.WriteResult(a, b);  

    Console.WriteLine("Нажмите любую кнопку для выхода...");
    Console.ReadKey();
}
VB.NET:
public Shared Sub Main()
    Dim a As Double = MathOperation.Assign("a")
    Dim b As Double = MathOperation.Assign("b")

    Dim _operations As List(Of MathOperation) = New List(Of MathOperation)
    _operations.Add(New Addition())
    _operations.Add(New Subtraction())
    _operations.Add(New Multiplication())
    _operations.Add(New Division())
    _operations.Add(New Power())

    For Each _operation As MathOperation In _operations
        _operation.WriteResult(a, b)
    Next

    Console.WriteLine("Нажмите любую кнопку для выхода...")
    Console.ReadKey()
End Sub

Резюме

Если тема программирования вам интересна, а объектно-ориентированное программирование перестало быть для вас чем-то непонятным, то вы в любом случае прочитаете еще много различной литературы на эту тему. Я же, со своей стороны, рекомендую познакомиться с материалами курса программирования C# Quick Guide™. Надеюсь, это будет не бесполезно.

Самостоятельно

Предлагаю добавить определение производного класса, выполняющего целочисленное деление или возвращающего остаток от деления.

Далее: Уроки орфографии.



Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.