Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Научите работать с классами в VB.NET ! Ищу наставника! 
V
    Опции темы
mihanik
Дата 5.10.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Привет!

Сегодня установил себе студию.
Сижу читаю всяко разно...

ТУТ много интересного.
Но там при объяснении часто используется понятие класса...
Раньше немного программировал на VB6.
Но классы не использовал.

Кто-нибудь сможет на пальцах объяснить для особо одарённых понятие класса?
 smile 




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Pankon
Дата 5.10.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Если уж совсем просто, то класс это шаблон, по образу и подобию которого можно создавать любое количество обьектов...
PM MAIL   Вверх
ivashkanet
Дата 5.10.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 5
Всего: 149



mihanik, давай конкретные вопросы. 
Не хочешь же ты, чтобы мы тебе новую собственноручно написанную статью дали  smile 
PM MAIL WWW ICQ   Вверх
Hidrag
Дата 5.10.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: нет
Всего: 25



Тебе нужно разобраться с теорией объектно ориентированного программирования, тогда все поймешь, что такое класс что такое экземпляр, и языки программирования для тебя будут различаться только синтаксисом.

Это сообщение отредактировал(а) Hidrag - 5.10.2006, 15:27


--------------------
user posted image
PM WWW ICQ   Вверх
DarkDragon
Дата 5.10.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



В VB.NET есть понятие класс и структура. Вот тока совсем не понимаю из чего состоит класс (с точки зрения самого процессора), но знаю как его кушать.
Структуры и классы в VB.NET могут содержать в себе функции(function/sub), переменные(variables), случаи(events), проперции(properties). Одно из отличий класса и структуры, это то что класс передается по ссылке, а структура по значению.

Чтобы создать свой класс, много ума не требуется:
Код

  [Public/Private/Protected/Friend] Class MyClass

  End Class

Public/Private/Protected/Friend - радиус видимостиsmile

одно из причин реализации классов это унаследование.
Чтобы унаследовать какой нибудь класс тебе нужно использовать ключевое слово Inherits
Код

  Public Class MyObject
       Inherits Object
  End Class


Конструктор в VB.NET, процедура New.
Код

  Public Class MyClass
     Public Sub New()
       MsgBox ("Create MyClass")
     End Sub
  End Class


Чтобы использовать данные класса, нужно создать новый класс.
Код

  Dim mClass As MyClass = New MyClass()
  MsgBox (mClass.MyVariableString)

Но можно обойтись и без создания нового класса, если данные в классе обьявлены как Shared в VB, тоже что и static в C++, C#.

Код

  Public Class MyClass
     Public Shared MsgStr As String = "Hello World! :) "
     Public Shared Sub MySub()
     End Sub
  End Class

  MsgBox (MyClass.MsgStr)
  MyClass.MySub()


Ешо можно приделать интерфэйс. Но сам не доганяю для чего он нужен. Возможно Interface - это скелет класса? Или основа? А может что то и другое...

Ну это не все что можно делать с классом.

Если ты создашь Windows Application, то автоматически получишь форму Form1. Это как раз и есть класс, унаследующий
класс Form.

А если тебе нужна тока теорию, то прямо в MSDN. Тама се про класс и написано.


PM MAIL   Вверх
Exception
Дата 5.10.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Эй-эй, нет смысла изучать, как объявлять классы, если не знать теории ООП. Так ты только сделаешь хуже для самого себя.
А вообще, класс - это абстракция объекта реального мира, используемая в программе.
PM   Вверх
DarkDragon
Дата 5.10.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



Если мне память не отшибло, то в первые классы стали реализоваваться в C, а унаследования в C++. И при чем тут
понятие класс и ООП. Если я не ошибаюсь ООП использует класс как обьект, со всеми прилагающими услугами (Properties, Events, ....).
PM MAIL   Вверх
mihanik
Дата 6.10.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Хм...
Не могу понять, кто пометил данный вопрос, как решённый...  smile 

Это,  по крайней мере, не вежливо.
По-моему, только человек поднявший вопрос может определить, решён вопрос или нет.

Это как буд-то мне дали понять, что я тру-ля-ля негожее...
Обидно, знаете ли!

Добавлено @ 06:55 
Спасибо, thomas и DarkDragon!

Если будут появлятся вопросы, можно их задавать в письме?

Это сообщение отредактировал(а) mihanik - 6.10.2006, 06:56


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 6.10.2006, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Кстати!

Вот ЗДЕСЬ (http://www.gotdotnet.ru/LearnDotNet/VBNET/125221.aspx) кое-что интересное написано про ООП и классы...


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Naum
Дата 6.10.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 2
Всего: 15



Цитата(DarkDragon @  5.10.2006,  19:01 Найти цитируемый пост)
Ешо можно приделать интерфэйс. Но сам не доганяю для чего он нужен. Возможно Interface - это скелет класса? Или основа? А может что то и другое...

Интерфесы, насколько я понимаю для симмуляции множесвенного наследования, потому что в .Net-вских
языках (не знаю как в C++, но в C# и в VB точно) класс не может быть наследником нескольких классов, зато он может реализовывать несколько интерфейсов.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
ivashkanet
Дата 6.10.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 5
Всего: 149



Цитата(DarkDragon @  5.10.2006,  18:01 Найти цитируемый пост)
шо можно приделать интерфэйс. Но сам не доганяю для чего он нужен.

Когда я только начал изучать C# мне попалось примерно такое объсянение:
Цитата
Интерфейс -- это контракт, который "подписывает" класс его реализующий. В этом "контракте" прописаны свойства и методы (а так же их сигнатуры) которые обязан (по контракту) реализовать класс.

Тогда оно мне было не очень понятно, а сейчас я считаю, что лучше его и не придумаешь.

Пример:
Код

Public Interface IУмеюСчитаться
    Function Считайся() As Integer
End Interface

Public Class Class1 : Implements IУмеюСчитаться
    Public Function Считайся() As Integer Implements IУмеюСчитаться.Считайся
        Console.WriteLine("Класс1 -- считаюсь")
    End Function
End Class

Public Class Class2 : Implements IУмеюСчитаться
    Public Function Считайся() As Integer Implements IУмеюСчитаться.Считайся
        Console.WriteLine("Класс2 -- считаюсь")
    End Function
End Class

Public Class Class3 : Implements IУмеюСчитаться
    Public Function Считайся() As Integer Implements IУмеюСчитаться.Считайся
        Console.WriteLine("Класс3 -- считаюсь")
    End Function
End Class

Теперь можно создать метод, который будет "заставлять" считаться классы которые умеют это делать:

Код

    Sub ЗаставитьСчитаться(ByVal счетовод As IУмеюСчитаться)
        счетовод.Считайся()
    End Sub

Либо можно объединять все объекты реализующие этот интерфейс в один масив и работать с ними всеми как с объектами одного типа:
Код

        Dim счетоводы(3) As IУмеюСчитаться
        счетоводы(1) = New Class1
        счетоводы(2) = New Class2
        счетоводы(3) = New Class3

        For Each счетовод As IУмеюСчитаться In счетоводы
            счетовод.Считайся()
        Next


Вот, в принципе, все про интерфейсы.
PM MAIL WWW ICQ   Вверх
Exception
Дата 6.10.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Цитата(DarkDragon @  5.10.2006,  20:15 Найти цитируемый пост)
И при чем тут
понятие класс и ООП.


Советую почитать, что такое класс.

По сути, класс объявляется так:

Код

Class SomeClass

End Class


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

В полях хранят данные класса. Например, можно объявить класс Point, представляющий точку, и для хранения координат использовать поля X и Y:

Код

Class Point
    ' Поля для хранения координат
    Public X As Double
    Public Y As Double
End Class

' Использование
Dim myPoint As New Point()
myPoint.X = 10
myPoint.Y = -10


Прекрасно, мы можем хранить данные. Но как быть с операциями, которые класс должен выполнять? Для объявления и реализации таких операций исполльзуются методы (также называемые процедурами или функциями).

Код

Class Point
    ' Поля для хранения координат
    Public X As Double
    Public Y As Double

    ' Метод для прорисовки точки на экране
    Public Sub Draw()
        ' Реализация нам сейчас не важна
    End Sub
End Class

' Вызываем метод
Dim myPoint As New Point()
myPoint.X = 10
myPoint.Y = -10

myPoint.Draw()


Методы могут принимать параметры - они выглядят как локальные переменные, но передаются из внешнего кода. Могут они и возвращать значения внешнему коду - тогда вместо ключегого слова Sub указывается ключевое слово Function, а в конце приписывается As тип_возвращаемого_значения.

Код

    ' Функция "сдвигает" новосозданную точку на переданные deltaX и deltaY
    Public Function Shift (deltaX As Double, deltaY As Double) As Point
        Dim returnedPoint As New Point()
        ' Для обращения к своим членам используется ключевое слово Me
        returnedPoint.X = Me.X + deltaX
        returnedPoint.Y = Me.Y + deltaY
        ' Возвращаем значение
        Return returnedPoint
    End Function


Использовать этот метод можно так:

Код

Dim somePoint As New Point()
somePoint.X = 10
somePoint.Y = -10

' ОБъявляем другую точку
Dim anotherPoint As Point = somePoint.Shift(-10, 10)
Console.WriteLine("anotherPoint ({0}; {1})" , anotherPoint.X, anotherPoint.Y)
' Консоль выводит
' anotherPoint (0, 0) 


Зачастую полей бывает вполне достаточно. А что если нужно как-то ограничить диапазон присваиваемых полям значений? Можно создать специальные функции, отвечающие за присваивание и возвращение значения поля, но проще воспользоваться встроенными средствами - свойствами. Обращение к свойству внешне не отличается от обращения к полю, разве что на самом деле выполняется дополнительный код:

Код

' Допустим, значения X и Y должны быть в пределах от -10 до 10
' Тогда сами значения мы будем хранить в защищённых полях _x и _y,
' а для "внешних" классов будут выставлены свойства X и Y

Class Point
    ' Поля для хранения координат, недоступные другим классам
    Private _x As Double
    Private _y As Double

    Public Property X As Double
        Get
            ' Часть Get являет собой код, выполняемый для возврата значения
            Return _x
        End Get
        Set (ByVal value As Double)
            If (value >= -10) And _
              (value <= 10) Then
                Записываем значение в поле
                _x = value
            Else
                ' Ошибка!
                Throw New ArgumentException("X должен быть от -10 до 10!")
            End If
        End Set
    End Property

    ' Аналогично и с Y
    Public Property Y As Double
        ' ...
    End Property
End Class

' Использование

Dim myPoint As New Point()
myPoint.X = 10
myPoint.Y = -10
myPoint.X = 20 ' Ошибка!


События - более сложная тема, и для начала тебе следует понять всё вышесказанное.

Далее, один класс может наследоваться от другого, расширяя его функциональность и при необходимости перепределяя её. Внимание: наследовать стоит только тогда, когда наследник моделирует отношение "is-a", то есть является какой-то разновидностью базового класса! Например, гипотетический класс Human (человек) мог бы наследовать от Animal (животное) или класс Triangle (треугольник) - от Figure (фигура), но нелогично наследовать квадрат от точки только потому что их определяют два числа - координаты у точки и длины сторон у квадрата. Треугольник является фигурой, но квадрат не является точкой. Это важно понять.

Чтобы унаследовать от другого класса, необходимо употребить ключевое слово Inherits. По умолчанию все классы наследуют от System.Object.

Код

MustInherit Class Animal
    Public MustOverride Sub MakeSound()
End Class

Class Cat
  Inherits Animal

    Public Overrides Sub MakeSound()
        Console.WriteLine("Мяяууу...")
    End Sub
End Class


Class Dog
  Inherits Animal

    Public Overrides Sub MakeSound()
        Console.WriteLine("Гав! Гав!")
    End Sub
End Class


Мы использовали в коде три новых модификатора. MustOverride указывает, что класс не реализует данный метод, а оставляет эту обязанность своим потомкам. Именно поэтому такой класс "без метода" создать с помощью оператора New нельзя - и он помечается как MustInherit. Потмки должны либо предоставить реализацию метода, либо также оставаться MustInherit.

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

Код

Dim boris As New Cat()
Dim bobik As New Dog()

' Объявляем список наших животных
Dim animals As New List(Of Animal)()
animals.Add(boris)
animals.Add(bobik)

' Теперь мы можем работать только с методами/членами, определёнными в классе Animal

' Переберём список, вызывая для каждого животного метод MakeSound()
For Each myAnimal As Animal in animals
    myAnimal.MakeSound()
Next    


Хотя, по сути, мы вызывали метод класса Animal, он был замещён своими переопределениями в классах Dog и Cat, и, как и ожидалось, код выводит на консоль

Код
Мяяууу...
Гав! Гав!



Всё, честно говоря, я немного устал сегодня, и если тебя заинтересовало всё это, советую сначала почитать о таких принципах ООП как инкапсуляцияполиморфизм, об абстрактных классах, а затем уже начинать применять всё это добро в VB .NET. Тогда и учить другие языки впоследствии будет существенно проще.
PM   Вверх
DarkDragon
Дата 6.10.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера. 

Цитата

  Если будут появлятся вопросы, можно их задавать в письме?

Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можноsmile

Цитата

Интерфесы, насколько я понимаю для симмуляции множесвенного наследования, потому что в .Net-вских
языках (не знаю как в C++, но в C# и в VB точно) класс не может быть наследником нескольких классов, зато он может реализовывать несколько интерфейсов.

Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface. 

Цитата

Интерфейс -- это контракт, который "подписывает" класс его реализующий. В этом "контракте" прописаны свойства и методы (а так же их сигнатуры) которые обязан (по контракту) реализовать класс.
 Логичнее не придумаешьsmile

Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал началоsmile Но уж точно не буду таким методом качать все линки на данной странице.). На gotdotnet, удалось прочесть тока начало, потом вышебало страницу. Так я понял что класс всего лишь используется ООП, но не как не является неотьемломой чатью(ООП используется и без классов, в JavaScript - из Wiki). Но если я не ошибаюсь то .NET построен на ООП, и по тому освоение принципов ООП обязательно.

Добавлено @ 23:58 
Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера. 

Цитата

  Если будут появлятся вопросы, можно их задавать в письме?

Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можноsmile

Цитата

Интерфесы, насколько я понимаю для симмуляции множесвенного наследования, потому что в .Net-вских
языках (не знаю как в C++, но в C# и в VB точно) класс не может быть наследником нескольких классов, зато он может реализовывать несколько интерфейсов.

Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface. 

Цитата

Интерфейс -- это контракт, который "подписывает" класс его реализующий. В этом "контракте" прописаны свойства и методы (а так же их сигнатуры) которые обязан (по контракту) реализовать класс.
 Логичнее не придумаешьsmile

Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал началоsmile Но уж точно не буду таким методом качать все линки на данной странице.). На gotdotnet, удалось прочесть тока начало, потом вышебало страницу. Так я понял что класс всего лишь используется ООП, но не как не является неотьемломой чатью(ООП используется и без классов, в JavaScript - из Wiki). Но если я не ошибаюсь то .NET построен на ООП, и по тому освоение принципов ООП обязательно.

Добавлено @ 23:59 
Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера. 

Цитата

  Если будут появлятся вопросы, можно их задавать в письме?
 
Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можноsmile

Цитата

Интерфесы, насколько я понимаю для симмуляции множесвенного наследования, потому что в .Net-вских
языках (не знаю как в C++, но в C# и в VB точно) класс не может быть наследником нескольких классов, зато он может реализовывать несколько интерфейсов.

Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface. 

Цитата

Интерфейс -- это контракт, который "подписывает" класс его реализующий. В этом "контракте" прописаны свойства и методы (а так же их сигнатуры) которые обязан (по контракту) реализовать класс.
 Логичнее не придумаешьsmile

Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал началоsmile Но уж точно не буду таким методом качать все линки на данной странице.). На gotdotnet, удалось прочесть тока начало, потом вышебало страницу. Так я понял что класс всего лишь используется ООП, но не как не является неотьемломой чатью(ООП используется и без классов, в JavaScript - из Wiki). Но если я не ошибаюсь то .NET построен на ООП, и по тому освоение принципов ООП обязательно.
PM MAIL   Вверх
DarkDragon
Дата 7.10.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



_____________
Не обращайте внимание на 3 добавки в мой ответsmile Это браузер гонит(после очередного нажатия Refresh).

Цитата

Не могу понять, кто пометил данный вопрос, как решённый...

Это происходит потому что, вызывается ошибка в mscorlib. Основной класс вызова: Exception.
После инструкции Catch Ex As Exception. Вызывается Exception.  Он резко смотрит вопрос, где поставил последний пост (на Vingrade=>.NET=>VB.NET), и помечает его как труе (Решенный = True). Тебе надо отправить письмо в мелкософт. Чтобы исправили багsmile Шутка конечноsmile

Это Exception помечает сообщения как решенные. А вообщем не обращай на это. Не кто тебя не принемает за тру ля ля.
Все когда-то начинали, и все когда-то что-то забывали.... 
PM MAIL   Вверх
Exception
Дата 7.10.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Ну привычка отмечать решённым smile . Да, пожалуй, я и правда забыл рассказать о джеренериках aka обобщениях, в чём-то схожих с шаблонами из С++. Они впервые появляются в .NET 2.0 (и VB 2005).
Часто бывает необходимо объявить в коде список элементов:
Код
Dim myList As New System.Collections.ArrayList()
myList.Add(3)
myList.Add("Hello, world!")
myList.Add(New Foo())
Все коллекции оперируют элементами типа System.Object - это необходимо для того, чтобы в коллекцию можно было добавить любой необходимый элемент. А что делать, если коллекция должна содержать элементы лишь одного типа? В .NET 1.0 с помощью стандартной коллекции или списка этого не достичь:
Код
Dim myList As New ArrayList()
myList.Add(1)
myList.Add(2)
myList.Add("stuff") ' никто нам не запретит добавлять всякую ерунду
For Each element As Object In myList
    Console.WriteLine(CInt(element)) ' этот код вызовет ошибку для "stuff"
Next
Итак, обобщения позволяют параметризовать класс каким-либо типом. Знаю, звучит странно, но на деле всё это выглядит очень просто. Мы передаём классу с помощью специального синтаксиса тип, а он может его использовать в своём интерфейсе. В .NET 2.0 введены специальные коллекции, поддерживающие обобщения - они находятся в пространстве имён System.Collections.Generic. Классы ListDictionary - аналоги ArrayList и Hashtable. Но, в отличие от них, у классов есть параметры, позволяющие изменять их интерфейс, чтобы они принимали только элементы конкретного типа. Например, мы можем написать так:
Код
Dim myList As New List(Of Integer)()
myList.Add(1)
myList.Add(2)
' Ошибка компиляции:
' myList.Add("stuff")
For Each element As Integer In myList
    Console.WriteLine(element)
Next
Если мы посмотрим на описание методов класса List в Object Browser'е, мы увидим, что метод Add принимает параметр типа T, а сам класс имеет описание List(Of T). Как только мы определяем тип T (в данном случае, Integer), компилятор "заменяет" T на реальный тип. Например, если написать 
Код
Dim myList As New List(Of String)
, то свойство-индексатор Item будет возвращать значение типа String, что гарантирует статическую типизацию программы. Однако, мы можем не только использовать готовые обобщения, но и создавать собственные!
Код
Class Keeper (Of T)
    Private _object As T, _password As String

    Public Sub New (object As T, password As String)
        If object IsNot Nothing Then
            Me._object = object
            Me._password = password
        Else
            Throw New ArgumentNullException("Аргумент не должен быть пуст!")
        End If
    End Sub

    Public ReadOnly Property Item (password As Sting) As T
        Get
            If password = _password Then
                Return _object
            Else
                Throw New SecurityException("Неверный пароль!")
            End If
        End Get
    End Property
End Class
Этот класс предназначен для хранения объекта под паролем. Пример использования нашего класса:
Код
Dim secret As String = "my secret"
Dim secretKeeper As New Keeper(Of String)(secret, "a password")
' ...
Dim revealedSecret As String = Keeper.Item("a password") ' никакого преобразования типов не нужно
Один класс может принимать много generic-параметров:
Код
Dim numbers As New Dictionary(Of Integer, String)()
numbers.Add(0, "zero")
numbers.Add(1, "one")
' Ошибка компиляции:
' numbers.Add("some", "stuff")
Сигнатура метода Add выглядит как Add (TKey, TValue). Вот, собственно, и всё, о чём мне было не лень пока что написать smile .
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1577 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.