Отправляет email-рассылки с помощью сервиса Sendsay

Visual Basic.NET. Уроки

  Все выпуски  

Visual Basic. Уроки.


Информационный Канал Subscribe.Ru

Основы VB.NET. Уроки с сайта http://progs.biz

Рассылка №8

Основы VB.NET. Урок 3. Классы в VB.NET.
Основы VB.NET. Урок 4. Поля и свойства классов в VB.NET.

Полные версии уроков (с картинками) можно найти по адресам
Урок 3. Классы в VB.NET.
Урок 4. Поля и свойства классов в VB.NET.

Основы VB.NET. Урок 3. Классы в VB.NET

Ну вот, теперь, с приходом VB.NET, классы в нем стали действительно классами. Их можно наследовать один от другого, и вообще с ними можно делать все, что раньше было возможно только в других, "настоящих" объектно-ориентированных языках.

Для начала обсудим, что такое вообще классы. Лучше всего представлять себе класс как некоторую форму или некоторый шаблон, по которому мы можем конструировать объекты. Скажем, мы можем сделать класс "Квадратное уравнение" (и на одном из последующих уроков мы его обязательно сделаем). Наш класс "Квадратное уравнение" будет некоторым шаблоном, по которому мы сможем делать конкретные экземпляры - т. е. квадратное уравнение с конкретными коэффициентами. У одного экземпляра коэффициенты будут одни, у другого - другие. Кроме того, в нашем классе будут функции для нахождения корней квадратного уравнения. Заметьте, что формулы для нахождения корней у всех квадратных уравнений одинаковы. Эти функции (или, что более правильно, методы) будут принадлежать не конкретному экземпляру (квадратному уравнению), а всему нашему классу "квадратных уравнений". И это важно понять, что класс помимо некоторых данных содержит, как правило, еще и методы, которые работают с этими данными.

Давайте перепишем нашу программу с прошлого урока так, чтобы она использовала классы. Для этого измените ее текст следующим образом:

Imports System
Class MyFirstClass
  Public Shared Sub Main()
    Console.WriteLine("First App")
  End Sub
End Class

Запускайте программу (Ctrl+F5). Результат должен быть такой же, как и на предыдущем уроке - в консольном окне появится надпись "First App".

Теперь давайте разбираться с тем, что мы тут написали. Во-первых, мы завели класс. Он пишеться между строками Class имя_класса и End Class:

...
Class MyFirstClass
 ...
End Class

Имя класса, разумеется, может быть любое. Мы назвали наш класс MyClass, и могли назвать его как угодно. Далее, внутри нашего класса есть метод Main. Помните замечание пошлого урока, что в каждой программе должен быть Main? На этом уроке мы поместили Main прямо в класс, но в принципе это не обязательно. Метод Main нашего класса мы написали с модификатором доступа Public. Это для того, чтобы наш метод можно было бы вызвать извне класса. Далее перед методом Main стоит еще один модификатор - Shared. Он означает, что метод Main возможно вызвать без создания экземпляра класса. И действительнол, обратите внимание, что мы нигде в нашей программе не создаем никакого экземпляра нашего класса. Метод Main возможно вызвать именно потовму, что он объявлен как Shared.

Давайте теперь модифицируем нашу программу так, чтобы у нас создавался экземпляр класса. Вот новый текст:

Imports System
Class MyFirstClass
  Sub F()
    Console.WriteLine("First App")
  End Sub
End Class
Module MyModule
  Public Sub Main()
    Dim cl As New MyFirstClass()
    cl.F()
  End Sub
End Module

Обратите внимание на следующие изменения - во-первых, функция Main теперь не в классе MyFirstClass, а в модуле MyModule (помните, что функция Main должна быть только одна). В нашем классе мы просто переименовали эту функцию в F. Далее мы в модуле MyModule заводим экземпляр cl нашего класса:

...
    Dim cl As New MyFirstClass()
 ...

Так как мы объявляем экземпляр класса, то мы используем слово new. Во всем другом объявление аналогично объявлению переменных, скажем, целого типа:

...
    Dim k As Integer
 ...

В следующей строчке мы вызываем для данного экземпляра класса метод F:

...
    cl.F()
 ...

Этот вариант программы выведет, как и следовало ожидать, туже самую надпись "First App". Если программа не запускается, то проверьте в свойствах проекта, что указывается в качестве начального объекта для запуска. Для этого щелкайте правой кнопкой мыши на имени проекта в окне Solution Explorer и выбирайте Properties.

В появившемся окне FirstApp Property Pages задайте Startup Object как MyModule.

Нажимайте OK и, если других ошибок нет, то все должно заработать.

И, напоследок, приведем еще третий вариант нашей программы - теперь экземпляр нашего класса MyFirstClass будет создаваться в другом классе (так, кстати, чаще всего и делается). Второй класс мы назовем Test:

Imports System
Class MyFirstClass
  Sub F()
    Console.WriteLine("First App")
  End Sub
End Class
Class Test
  Public Shared Sub Main()
    Dim cl As New MyFirstClass()
    cl.F()
  End Sub
End Class

Не забудьте только поменять в окне FirstApp Property Pages параметр Startup Object на Test. И опять обратите внимание, что для метода Main тестового класса Test мы используем ключевое слово Shared (так как мы не создаем экземпляра этого класса).

Наверх

Основы VB.NET. Урок 4. Поля и свойства классов в VB.NET

Внутри экземпляра класса могут содержаться данные. Например, если есть класс "Квадратное уравнение", то экземпляр такого класса содержит в себе коэффициенты конкретного уравнения, если есть класс "Работник", то экземпляр такого класса может содержать в себу такие данные как возраст, стаж и т. п. Заметься сразу, что данные класса, в отличие от методов класса, принадлежат отдельному экземпляру класса. Т. е., например, у одного работника возраст один, а у другого, естественно, другой (вообще-то говоря, данные тоже могут быть разделяемыми, но это мы сейчас обсуждать не будем, а рассмотрим в одном из последующих уроков).

Данные класса могут быть реализованы или как поля, или как свойства. Вот пример класса, где данные реализованы как поля:

Imports System
Class Worker
  'Задаем два поля в классе
  Public age As Integer
  Public name As String
End Class
Class Test
  Public Shared Sub Main()
    Dim wrk1 As New Worker()
    wrk1.age = 23
    wrk1.name = "Вася"
    Console.WriteLine("Имя: {0}, возраст: {1}", wrk1.name, wrk1.age)
  End Sub
End Class

Обратите внимание, что оба поля в классе Worker - age и name, мы задали как Public. Именно поэтому мы можем напрямую обращаться к ним извне класса:

...
    cl.age = 23
    cl.name = "Вася"
 ...

В тестовом классе Test мы создаем экземпляр wrk1 класса Worker и затем присваиваем его полям некоторые значения. В строке

...
    Console.WriteLine("Имя: {0}, возраст: {1}", wrk1.name, wrk1.age)
 ...

мы выводим значения на экран. Синтаксис здесь такой - в кавычках мы пишем все, что мы хотим вывести, при этом места для вывода переменных мы резервируем как {0}, {1} и т. д. (резервируем столько мест, сколько переменных), сами же переменные пишем в качестве последующих параметров WriteLine через запятую.

В результате выполнения программа выведет на экран "Имя: Вася, возраст: 23".

Но такой способ (через поля) задания даннных в классе не слишком хорош. Вот пример другого ("неправильного") использования нашего класса Worker в классе Test:

...
Class Test
  Public Shared Sub Main()
    Dim wrk1 As New Worker()
    wrk1.age = -23
    ...
  End Sub
End Class

Как вы видите, ничто не мешает записать в качестве возраста Васи отрицательное число. И ничего, никакой ошибки не возникает. Именно для того, чтобы таких казусов не возникало, и рекомендуется использовать для данных класса не поля, а свойства. Вот как это делается:

Class Worker
  'Задание свойсва
  Property age() As Integer
    'Чтение свойства
    Get
      Return ageValue
    End Get
    'Запись свойства
    Set(ByVal Value As Integer)
      If Value <= 0 Then
        ageValue = 0
      Else
        ageValue = Value
      End If
    End Set
  End Property
  Private ageValue As Integer
  Public name As String
End Class

Что мы тут измемнили? Во-первых, мы вместо Public-переменной age задали Private-переменную ageValue:

  ...
  Private ageValue As Integer
  ...

Ключевое слово private означает, что прямого доступа извне класса к этой переменной нет. Далее мы завели в нашем классе свойство age целого типа:

  ...
  Property age() As Integer
    ...
  End Property
  ...

Внутри этого свойства мы задаем правила его чтения и записи:

  ...
    'Чтение свойства
    Get
      ...
    End Get
    'Запись свойства
    Set(ByVal Value As Integer)
      ...
    End Set
  ...

При этом когда мы читаем наше свойство age, то мы фактически читаем значение переменной ageValue:

  ...
  Get
    Return ageValue
  End Get
  ...

Записываем мы нечто в свойство age только тогда, когда это нечто положительное, если же оно отрицательное или ноль, то записываем ноль:

  ...
    Set(ByVal Value As Integer)
      If Value <= 0 Then
        ageValue = 0
      Else
        ageValue = Value
      End If
    End Set
  ...

Используем мы наш новый вариант класса также, как и старый:

    ...
    Dim cl As New Worker()
    cl.age = 23
    ...

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

Наверх

Copyright Алексеев Игорь, 2002

Copyright сайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное