
- •Программирование и алгоритмические языки. Курс за третий семестр.
- •Введение в объектно-ориентированное программирование (ооп)
- •Идеологический обзор
- •Базовые принципы ооп
- •Наследование имён. Наследование значений.
- •Коллизия
- •Что такое имя процедуры?
- •Ооп как оперирование типами
- •Именование типов в c# Тип данных «класс»
- •Конструкторы и деструкторы
- •И нкапсуляция данных
- •Наследование (краткое введение)
- •Наследование реализации как уточнение семантики типа
- •Пополнение и переопределение методов Отношение пополнения интерфейса
- •Открытие реализации для проектирования классов - опция protected
- •Полиморфизм Полиморфизм как уточнение семантики типа переменной
- •Динамические методы как поддержка полиморфизма- опции static, virtual, override
- •Событийное программирование Обработка событий
- •Идея: Когда что-то вставляется, срабатывает некоторый предикат. Например, после вызывается команда проверки, каскадного удаления или какая-нибудь другая команда. Генераторы и приёмники сообщений
- •Событийное программирование нужно:
- •Событийный стиль в процедурном программировании - управление данными (на примере)
- •Событийное программирование в c# (delegate, event)
- •Введение в компонентное программирование
- •Объекты, реализующие интерфейсы
- •Частный случай общей проблемы взаимодействия программного обеспечения разных производителей на уровне исполняемого кода
- •Базовый интерфейс компонент
- •Проблема множественности иерархий
- •Коллизия имён
- •Коллизия реализации
- •«Симметричное» решение – агрегаты (декартовы произведения классов)
- •Множественное наследование
- •«Асимметричное» решение - именованные интерфейсы
- •Основные отличия интерфейса и абстрактного класса
- •Наследование интерфейса (компонентный подход)
- •Обработка исключений в ооп
- •Определение и генерация исключений в c#
- •Выбрасывание исключений
- •Захват исключения
- •Блок finally
- •Коды программ
Открытие реализации для проектирования классов - опция protected
Для реализации ограничения доступа применяется модификатор доступа- PROTECTED.
-protected- виден классам-наследникам. Это даёт возможность скрыть от наследников переменную так, чтобы они не «напортачили» в ней.
-internal- модификатор доступа, который используется для методов, доступных всем классам, определённым в конкретной сборке
//Задача: Черепашья графика. Простая модель управления роботом-черепашкой, которая рисует на дискретной сетке.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Turtle//логически связанное определение имён
{
enum tColor {red, green, blue} //перечисляемый тип, состоящий из цветов
class cCell
{
protected internal tColor Color; // определение переменной Color типа tColor
//set-get:
public tColor GetColor() {return Color;}
cCell (tColor Color) {this.Color= Color;} // конструктор
} //class cCell
class cGrid //сетка
{
protected int Dim; //размерность
public int GetDim() {return Dim;}
protected internal cCell [,] Grid; //сама сетка(массив Grid) типа cCell (т.е. перечисляемого типа {red, green, blue})
// текущая позиция
protected internal int CurrentX; //, где internal означает то, что доступ ограничен текущей сборкой,
//а protected означает, что доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса.
protected internal int CurrentY;
public int GetCurrentX() {return CurrentX; }
public int GetCurrentY() {return CurrentY; }
protected void Move (int x, int y )
{
//модульная арифметика(выход за границы)
CurrentX+=x; //эквивалентно выражению CurrentX = CurrentX + x
CurrentY+=y;
} // Move
cGrid (int Dim, tColor Color) //конструктор
{
this.Dim= Dim;
CurrentX=0;
CurrentY=0;
Grid= new cCell [Dim, Dim];
for (int i= 0; i<Dim; i++)
for (int j=0; j<Dim; j++)
Grid [i, j].Color= Color;
}
}
class TurtleGraphics: cGrid
{
//поля
public bool PenDown;// состояние пера- карандаш
public tColor PenColor;
public void GoUp()
{
Move(0,1);
if (PenDown) Grid[CurrentX, CurrentY].Color = PenColor;
}//PenGoUp
public void GoRight()
{
Move(1,0);
if (PenDown) Grid[CurrentX, CurrentY]. Color = PenColor;
}//PenRight
public void GoLeft()
{
Move(-1,0);
if (PenDown) Grid[CurrentX, CurrentY]. Color = PenColor;
}//PenLeft
public void GoDown ()
{
Move(0,-1);
if (PenDown) Grid[CurrentX, CurrentY]. Color = PenColor;
}//PenDown
}//class TurtleGraphics: cGrid
class Program
{ //запускалка
static void Main ()
{
}
}//class Program
}//namespace TurtleGraphics
Итак, появляются отношения использования и отношения наследования.