ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В MS VISUAL STUDIO 2005 НА ПРИМЕРЕ VISUAL BASIC.NET
А.Ю. Веселков, А.Ю. Лагунов
Поморский государственный университет имени М.В.Ломоносова, г. Архангельск, Россия
Технология ООП (объектно ориентированного программирования) основана на трех основополагающих концепциях: инкапсуляция, наследование и полиморфизм [1; 2]. Основная проблема при обучении ООП -эффектные примеры для демонстрации данных концепций.
Инкапсуляция - объект представляет собой контейнер, содержащий в себе данные и программы по управлению данным объектом. Класс объединяет объекты, имеющие одинаковый набор свойств и схожее поведение (методы).
Проект «Приветствие»
Public Class Sudar 'поля (все закрыты)
Private NameValue, StatusValue As String Private AgeValue As Integer 'методы - свойства
'стратегия: Read,Write (Чтение, запись) Property Name() As String Set(ByVal value As String)
NameValue = value End Set Get
Return NameValue End Get End Property
'стратегия: Read-only(Только чтение) Property Status() As String Set(ByVal value As String)
End Set Get
Return StatusValue End Get End Property
'стратегия: Read,Write (Чтение, запись) Property Age() As Integer Set(ByVal value As Integer)
AgeValue = value Select Case AgeValue Case Is < 7
StatusValue = "ребенок"
Case 8 To 17
StatusValue = "школьник"
Case 18 To 22
StatusValue = "студент"
Case Else
StatusValue = "служащий"
End Select End Set Get
Return AgeValue End Get End Property End Class
Public Class frmPrivet Dim User As New Sudar()
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click End End Sub
Private Sub txtInput_TextChanged(ByVal sender As System.Object, ByVal e As Sys-tem.EventArgs) Handles txtInput.TextChanged User.Name = txtInput.Text lblOutput.Text = "Здравствуй, " & Us-er.Name & "!"
End Sub
Private Sub txtAge_TextChanged(ByVal sender As System.Object, ByVal e As Sys-tem.EventArgs) Handles txtAge.TextChanged If txtAge.Text = "" Then User.Age = 0 Else
User.Age = txtAge.Text End If
lblStatus.Text = "Вы " & User.Status End Sub End Class
Приветствие
Введите свое имя
Сколько Вам лет?
Вы ребенок
Выход
Наследование - одна из самых важных черт ООП. Вкратце она представляет из себя следующее - вы создаете один класс как потомок другого. Эти два класса называется потомок и предок соответственно. Часто говорят еще о дочернем и родительском классе. Созданный вами класс автоматически получает все способности своего родительского класса. Плюс в классе-потомке вы добавляете еще что-нибудь, чего не было в классе родительском - какие-нибудь методы или поля.
Проект «Дом»
‘Родительский класс Public Class Dom Protected picGr As Graphics Protected X, Y, Shirina As Integer Protected Pen As Pen ' Констуктор
Public Sub SetDom(ByVal posX As Integer, ByVal posY As Integer, ByVal A As Integer, ByVal picG As Graphics, ByVal PenDraw As Pen) MyClass.X = posX MyClass.Y = posY MyClass.Shirina = A MyClass.picGr = picG MyClass.Pen = PenDraw End Sub
Public Overridable Sub Show() picGr.DrawRectangle(Pen, X, Y - Shirina, Shirina, Shirina)
Dim pointsKrisha As Point() = _
{New Point(X + Convert.ToInt16(-Shirina / 10), Y - Shirina), _
New Point(X + Convert.ToInt16(0.5 * Shirina),
Y - 2 * Shirina), _
New Point(X + Convert.ToInt16(1.1 * Shirina),
Y - Shirina), _
New Point(X + Convert.ToInt16(-Shirina / 10),
Y - Shirina)}
picGr.DrawLines(Pen, pointsKrisha) picGr.DrawRectangle(Pen, X + Con-vert.ToInt16(0.25 * Shirina), Y - Con-
vert.ToInt16(0.75 * Shirina), Convert.ToInt16(0.5 * Shirina), +Convert.ToInt16(0.5 * Shirina))
picGr.DrawEllipse(Pen, X + Con-
vert.ToInt16(0.4 * Shirina), Y - Convert.ToInt16(1.5 * Shirina), Convert.ToInt16(0.2 * Shirina), Con-vert.ToInt16(0.25 * Shirina))
End Sub End Class ‘Дочерний класс Public Class DomTruba Inherits Dom
Public Overrides Sub Show()
MyBase.Show()
Dim pointsTruba As Point() = _
{New Point(X + Convert.ToInt16(Shirina * 0.15), Y - Convert.ToInt16(Shirina * 1.42)), _
New Point(X + Convert.ToInt16(Shirina * 0.15), Y - 2 * Shirina), _
New Point(X + Convert.ToInt16(Shirina * 0.3),
Y - 2 * Shirina), _
New Point(X + Convert.ToInt16(Shirina * 0.3),
Y - Convert.ToInt16(Shirina * 1.66))}
picGr.DrawLines(Pen, pointsTruba)
End Sub End Class Imports System
Imports System.Windows.Forms Imports System.Drawing Public Class frmDom Dim picGraphics As Graphics Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click End End Sub
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
Dim whiteBrush = New Solid-Brush(Color.White)
picGraphics.FillRectangle(whiteBrush, 0,
0, picDom.Width, picDom.Height)
End Sub
Private Sub frmDom_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
picGraphics = picDom.CreateGraphics() End Sub
Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDraw.Click
Dim X, Y, A As Integer X = Convert.ToInt16(txtX.Text)
Y = Convert.ToInt16(txtY.Text)
A = Convert.ToInt16(txtA.Text)
Dim greenPen = New Pen(Color.Green) Dim DomN = New Dom() DomN.SetDom(X, Y, A, picGraphics,
greenPen)
DomN.Show()
Dim redPen = New Pen(Color.Red)
Dim DomM = New DomTruba() DomM.SetDom(X + 100, Y, A, picGraph-ics, redPen)
DomM.Show()
End Sub End Class
HEB
В ведите X |50 ] Введите Y 1200 ] Введите А 50
/°\ b
□ □
Полиморфизм реализуется в ситуации, когда есть иерархия классов, и в каждом классе-потомке есть метод, который выполняет одно и то же действие. Но во всех классах-потомках это действие выполняется по-
разному. В этом случае мы объявляем этот метод в классе-предке, но реализацию этого метода в классе-предке мы не пишем (а пишем отдельно в каждом классе-потомке). Класс-предок при этом мы объявляем как абстрактный. Создавать экземпляры такого класса нельзя - он используется только как предок для других классов в иерархии.
Проект «Площадь фигуры»
Абстрактный класс MustInherit Class Figure Public MustOverride Function Ploshad() As
Single
End Class
Класс четырехугольник Class Quadrangle Inherits Figure
'Сторона четырехугольника Private a, h As Single 'Конструктор
Public Sub New(ByVal a1 As Single, ByVal h1 As Single) a = a1 h = h1 End Sub
'Реализуем метод Ploshad
Public Overrides Function Ploshad() As Sin-
gle
Return a * h End Function End Class
gle
Класс круг Class Circle Inherits Figure 'Радиус
Private r As Single 'Конструктор
Public Sub New(ByVal r1 As Single) r = r1 End Sub
'Реализуем метод Ploshad
Public Overrides Function Ploshad() As Sin-
r * r
Return Math.PI *
End Function End Class
Основная программа Public Class frmSFigure Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click End End Sub
Private Sub rdbQuadran-
gle_CheckedChanged(ByVal sender As Sys-tem.Object, ByVal e As System.EventArgs) Handles rdbQuadrangle.CheckedChanged
Dim SQuad As New Quadran-gle(Convert.ToSingle(txtA.Text), Con-
vert.To Single(txtH.Text))
lblS.Text = "S=" & Con-
vert.ToString(SQuad.Ploshad)
End Sub
Private Sub rdbCir-
cle_CheckedChanged(ByVal sender As Sys-tem.Object, ByVal e As System.EventArgs) Handles rdb Circle. CheckedChanged
Dim SCircle As New Cir-cle(Convert.To Single(txtR. T ext))
lblS.Text = "S=" & Con-
vert.ToString(SCircle.Ploshad)
End Sub End Class
SS Площадь фигуры
© Четырехугольник
Введите основание 10 □
Введите высоту 5 □
О Окружность
Введите радиус 10 □
Э=50
В ыксд
Таким образом, приведенные 3 примера могут быть использованы в работе учителя информатики для демонстрации основных концепций ООП.
Литература
1. Самоучитель Visual C++.NET / В. Кораб-лев. СПб., 2004.
2. Современная практика программирования Microsoft на Visual Basic и Visual C#: учеб. пособие / пер. с англ. Ф. Балена, Д. Димауро. М., 2006.