Модераторы: 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   Вверх
mihanik
Дата 8.10.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ребята!!!

Огромное спасибо!!!  smile 

Не думал, что получу столько интересной информации!!!

Теперь даже как-то стыдно не разобраться во всём этом...

Отдельное спасибо thomas за то письмо, которое он мне прилал на личный ящик.
Его можно хоть в ФАК выкладывать, хоть куда!!!


ПРОСЬБА К МОДЕРУ!!!
thomas не отметился в этом посте, но всё равно очень мне помог в изучении поднятой темы.
Сделайте ему "+" в репутацию!!!



Ещё раз всем спасибо!!!

Это сообщение отредактировал(а) mihanik - 8.10.2006, 14:01


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


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


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

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



Цитата(mihanik @  8.10.2006,  13:59 Найти цитируемый пост)
thomas не отметился в этом посте, но всё равно очень мне помог в изучении поднятой темы.Сделайте ему "+" в репутацию!!!

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


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


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

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



ivashkanet
Цитата(ivashkanet @  8.10.2006,  14:12 Найти цитируемый пост)
Найди любой его пост и дай плюс    


Рассматривал такую возможность, но пока её отверг.
Я не хочу за какой-нибудь пост! smile 

Я хочу именно за этот!!! smile 

Мы (белые медведи) простых решений не ищем!!!  smile 

Это сообщение отредактировал(а) mihanik - 8.10.2006, 14:28


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


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


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

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



Цитата(mihanik @  8.10.2006,  14:26 Найти цитируемый пост)
Я хочу именно за этот!!! 

А чем тебе модератор помочь может????
Он ведь не сможет создать тут пст за Томаса  smile 

И вообще: "заныканый ФАК в студию"
PM MAIL WWW ICQ   Вверх
$tatic
Дата 8.10.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mihanik @  8.10.2006,  15:26 Найти цитируемый пост)
Я не хочу за какой-нибудь пост! smile 
Я хочу именно за этот!!! smile 

Цитата(ivashkanet @  8.10.2006,  16:24 Найти цитируемый пост)
И вообще: "заныканый ФАК в студию" 

Стукни Томасу в ПМ, попроси пусть письмо выложит. Тогда сразу обе проблемы и решатся smile
PM MAIL   Вверх
thomas
Дата 8.10.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Всем привет.

Я сам пользуюсь и другим предлогаю попробовать.
Для удобства написания класса логично использовать шаблон. Я его сохранил в txt файл и копирую в добавленный в проект класс.
А потом начинаю в соответствии с задачей писать код.
Вот как это примерно выглядит. Коментарии и есть шаблон.
Код

Public Class clsFile

    '------------------------------------------------------------
    'К О Н С Т Р У К Т О Р Ы класса
    '------------------------------------------------------------
    'конструктор без параметров
    Public Sub New()

    End Sub
    'конструктор с параметром(-и)
    Public Sub New(ByVal Path As String) '(ByVal Path As String, ByVal File As String)
        mPath = Path 'тоесть уже при создании экземпляра класса мы задем атрибут mPath
        'mFile=File 'здесь сразу задаем путь и имя файла
    End Sub

    '------------------------------------------------------------
    'А Т Р И Б У Т Ы  (поля)
    '------------------------------------------------------------
    'буковка "m" обозначает что это внутренная переменная
    Private mPathFile, mPath, mFile As String
    Private mFileExists As Boolean
    Private mIndex As Integer
    '-----------------------------------------------------------
    'С В О Й С Т В А
    '-----------------------------------------------------------
    'здесь используются Get и Set методы
    Public Property PathFile() As String
        Get
            Return mPathFile
        End Get
        Set(ByVal Value As String)
            mPathFile = Value
        End Set
    End Property
    'свойства могут быть как ReadOnly, только для чтения - метод "Get"
    Public ReadOnly Property Path() As String
        Get
            mIndex = mPathFile.LastIndexOf("\")
            mPath = mPathFile.Substring(0, mIndex)
            Return mPath
        End Get
    End Property

    Public ReadOnly Property FileExists() As Boolean
        Get
            If System.IO.File.Exists(mPathFile) Then
                Return True
            End If
        End Get
    End Property
    'свойства могут быть как  WriteOnly, тоько для записи - метод "Set"

    '--------------------------------------------------------------------------
    'М Е Т О Д Ы
    '--------------------------------------------------------------------------


    '--------------------------------------------------------------------------
    'С О Б Ы Т И Я
    '--------------------------------------------------------------------------

End Class

Код

Public Class clsFile

    '------------------------------------------------------------
    'К О Н С Т Р У К Т О Р Ы класса
    '------------------------------------------------------------
    'конструктор без параметров
    Public Sub New()

    End Sub
    'конструктор с параметром(-и)
    Public Sub New(ByVal Path As String) '(ByVal Path As String, ByVal File As String)
        mPath = Path 'тоесть уже при создании экземпляра класса мы задем атрибут mPath
        'mFile=File 'здесь сразу задаем путь и имя файла
    End Sub

    '------------------------------------------------------------
    'А Т Р И Б У Т Ы  (поля)
    '------------------------------------------------------------
    'буковка "m" обозначает что это внутренная переменная
    Private mPathFile, mPath, mFile As String
    Private mFileExists As Boolean
    Private mIndex As Integer
    '-----------------------------------------------------------
    'С В О Й С Т В А
    '-----------------------------------------------------------
    'здесь используются Get и Set методы
    Public Property PathFile() As String
        Get
            Return mPathFile
        End Get
        Set(ByVal Value As String)
            mPathFile = Value
        End Set
    End Property
    'свойства могут быть как ReadOnly, только для чтения - метод "Get"
    Public ReadOnly Property Path() As String
        Get
            mIndex = mPathFile.LastIndexOf("\")
            mPath = mPathFile.Substring(0, mIndex)
            Return mPath
        End Get
    End Property

    Public ReadOnly Property FileExists() As Boolean
        Get
            If System.IO.File.Exists(mPathFile) Then
                Return True
            End If
        End Get
    End Property
    'свойства могут быть как  WriteOnly, тоько для записи - метод "Set"

    '--------------------------------------------------------------------------
    'М Е Т О Д Ы
    '--------------------------------------------------------------------------


    '--------------------------------------------------------------------------
    'С О Б Ы Т И Я
    '--------------------------------------------------------------------------

End Class


В данном классе не прописаны методы и события.
В качестве методов могут выступать как субрутины, так и функции.
Для событий мы должны сначала обьявить событие, а потом описать метод его вызывающий.
Вот здесь можно прочитать об этом. http://msdn.microsoft.com/library/rus/defa.../vastmevent.asp


Кстати прочитать про интерфейсы можно в русской MSDN http://msdn.microsoft.com/library/rus/defa...nInterfaces.asp


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
DarkDragon
Дата 8.10.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


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

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



Цитата

А сам сделать не сможешь?
У тебя же 300 постов.

Шота я не понял, разве нельзя добавлять плюсы или минусы, если ниже 300?
PM MAIL   Вверх
mihanik
Дата 9.10.2006, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А вот то письмо, которое thomas прислал мне.

Цитата

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

Другими словами класс описывает обьект и то что с ним может происходить.
Каждый класс может содержать следующие подразделы: конструкторы класса, атрибуты класса, свойства(Properties), методы (Methode), события(Events).
Потому для написания класса полезно иметь такой вот шаблон

Код 

Public Class имя класса ' желательно с префиксом cls

    '------------------------------------------------------------
    'К О Н С Т Р У К Т О Р Ы класса
    '------------------------------------------------------------
    'конструктор без параметров
    
    'конструктор с параметром(-и)
   
    '------------------------------------------------------------
    'А Т Р И Б У Т Ы
    '------------------------------------------------------------
   
    '-----------------------------------------------------------
    'С В О Й С Т В А
    '-----------------------------------------------------------
    'здесь используются Getи Set методы
    
    'свойства могут быть как ReadOnly, только для чтения - метод "Get"
   
   
    'свойства могут быть как  WriteOnly, тоько для записи - метод "Set"

    '--------------------------------------------------------------------------
    'М Е Т О Д Ы
    '--------------------------------------------------------------------------


    '--------------------------------------------------------------------------
    'С О Б Ы Т И Я
    '--------------------------------------------------------------------------

End Class
 


Сохрани его в txt файл и копируй каждый раз когда пишешь класс.
А там определяйся что ты хочешь от своего класса.
Будешь ты писать отдельные конструкторыили оставишь по умолчанию - конструктор без параметров.
Какие атрибуты должен содержать класс, это типа местные переменные. При наименовании полезно двать префикс "m". Так ты будешь четко знать что эта переменная внутри класса.
Далее ты определяешься со свойствами. Здесь используются два метода которые примнимают значения и которые определяют значения (Get и Set) . Свойства могут быть только для чтения или только для записи. 

Код 

Public Property PathFile() As String
        Get
            Return mPathFile
        End Get
        Set(ByVal Value As String)
            mPathFile = Value
        End Set
    End Property
 


это свойство "путь к файлу". Принимает значение(Set) и передаёт его в класс для дальнейшего использования(Get).

Как может выглядеть простой класс для файлов.

Код 

Public Class clsFile

    '------------------------------------------------------------
    'К О Н С Т Р У К Т О Р Ы класса
    '------------------------------------------------------------
    'конструктор без параметров
    Public Sub New()

    End Sub
    'конструктор с параметром(-и)
    неопределены

    '------------------------------------------------------------
    'А Т Р И Б У Т Ы
    '------------------------------------------------------------
    'буковка "m" обозначает что это внутренная переменная
    Private mPathFile, mPath, mFile As String
    Private mFileExists As Boolean
    Private mIndex As Integer
    '-----------------------------------------------------------
    'С В О Й С Т В А
    '-----------------------------------------------------------
    'здесь используются Getи Set методы
    Public Property PathFile() As String
        Get
            Return mPathFile
        End Get
        Set(ByVal Value As String)
            mPathFile = Value
        End Set
    End Property
    'свойства могут быть как ReadOnly, только для чтения - метод "Get"
    Public ReadOnly Property Path() As String
        Get
            mIndex = mPathFile.LastIndexOf("\")
            mPath = mPathFile.Substring(0, mIndex)
            Return mPath
        End Get
    End Property

    Public ReadOnly Property FileExists() As Boolean
        Get
            If System.IO.File.Exists(mPathFile) Then
                Return True
            End If
        End Get
    End Property
    'свойства могут быть как  WriteOnly, тоько для записи - метод "Set"
    не определены

    '--------------------------------------------------------------------------
    'М Е Т О Д Ы
    '--------------------------------------------------------------------------
    не определены

    '--------------------------------------------------------------------------
    'С О Б Ы Т И Я
    '--------------------------------------------------------------------------
    не определены
    
End Class

 



Как мы используем этот класс
На форме распологаем текстбокс и кнопку. В текстбоксе пишем путь и файл, а кнопкой проверяем существует ли такой файл.

Код 

Private Sub btnTesten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTesten.Click
        Dim test As New clsFile 'создаем экземпляр класса(в нашем случае обьекта-файл, который описывает наш класс. Путь к файлу и имя файла)
        test.PathFile = txtPath.Text
        If test.FileExists = True Then
            MessageBox.Show(test.Path & Chr(13) & test.File)
        Else
            MessageBox.Show("Файла не существует!")
        End If
    End Sub
 



И самое интересное что, один раз написанный класс можно много раз использовать в разных программах и в одной и тойже программе в разных формах, создавая новый обьект класса для его использования. Просто нужно добавить этот класс в проект.

Следующий пример класса будет о клиенте ( ФИО)

Код 

Public Class clsПерсона
 '------------------------------------------------------------
    'К О Н С Т Р У К Т О Р Ы класса
    '------------------------------------------------------------
    неопределены

 '------------------------------------------------------------
    'А Т Р И Б У Т Ы
    '------------------------------------------------------------
    Public mФамилия, mИмя As String
    Private index As Int16
 '-----------------------------------------------------------
    'С В О Й С Т В А
    '-----------------------------------------------------------
    Public WriteOnly Property Фамилия() As String
        Set(ByVal Value As String)
            mФамилия = Value
        End Set
    End Property
    Public WriteOnly Property Имя() As String
        Set(ByVal Value As String)
            mИмя = Value
            Toekennen()
        End Set
    End Property
    Public ReadOnly Property Инициалы() As String
        Get
            Select Case index
                Case 0
                    mФамилия = mФамилия.ToUpper()
                    mИмя  = mИмя .ToUpper()
                Case 1
                    mФамилия = mФамилия.ToLower()
                    mИмя  = mИмя .ToLower()
                Case 2
                    mФамилия = mФамилия.ToUpper.Chars(0)
                    mИмя  = mИмя .ToUpper.Chars(0)
            End Select
            Return mФамилия.Chars(0) & mИмя .Chars(0)
        End Get
    End Property
    Public ReadOnly Property ФИО() As String
        Get
            Select Case index
                Case 0
                    mФамилия = mФамилия.ToUpper()
                   mИмя  = mИмя .ToUpper()
                Case 1
                    mФамилия = mФамилия.ToLower()
                    mИмя  = mИмя .ToLower()
                Case 2
                    mФамилия = mФамилия.ToUpper.Chars(0) & mФамилия.Substring(1).ToLower
                    mИмя  = mИмя .ToUpper.Chars(0) & mИмя .Substring(1).ToLower
            End Select
            Return mФамилия & " " & mИмя 
        End Get
    End Property
 '--------------------------------------------------------------------------
    'М Е Т О Д Ы
    '--------------------------------------------------------------------------
    ' это могут быть как субрутины(не возвращают значений), так и функции(возвращают значение определенного типа)
    Public Function Заполнено() As Boolean
        If mФамилия <> "" And mИмя <> "" Then
            Return True
        End If
    End Function
    Public Function ИзмениВид(ByVal sIndex As Int16)
        index = sIndex
        Return index
    End Function
 '--------------------------------------------------------------------------
    'С О Б Ы Т И Я
    '--------------------------------------------------------------------------

    Public Event СобственноеИмя()
    Public Sub Узнать() 'здесь субрутина написана рядом с событием, чтобы показать что вызывает это событие.
        If mИмя = "Иван" Or mИмя = "ИВАН" Or mИмя = "иван" Then
            RaiseEvent СобственноеИмя()
        End If
    End Sub

End Class
 


И что мы делаем на форме со всем этим. На форме у нас следующие контролы: два текстбокса, комбобоксб две label и кнопка.
В текстбоксы вводим фамилию и имя. Сомбобокс определяет как показывать ФИО в label большие/маленькие буквы или имя и фамия с заглавной буквы, а во второй инициалы.
Вот код для формы.

Код 

Private WithEvents Клиент As New clsПерсона 'создали экземпляр нашего класса

    Private Sub btnПокажи_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnToon.Click

        Клиент.Фамилия = txtФамилия.Text
        Клиент.Имя = txtИмя.Text
        If Клиент.Заполнено = True Then
            lblФИО.Text = Клиент.ФИО
            lblИнициалы.Text = Клиент.Инициалы
        Else
            MessageBox.Show("Укажите фамилию и имя", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub

    Private Sub cboType_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboType.SelectedIndexChanged
        Клиент.ИзмениВид(cboType.SelectedIndex)
    End Sub
'после заполнения проверит совпадает ли указанное имя с Иваном, ели да, то сгенерирует событие-покажет сообщение
    Private Sub Клиент_СобственноеИмя() Handles Клиент.СобственноеИмя
        MessageBox.Show("У тебя имя тоже Иван.")
    End Sub
 

 
 
В следующем примере покажу как использовать конструкторы класса с параметрами.


Добавлено @ 07:46 
БЛИН!!!!!
ТАК ХОЧЕТСЯ ВСЕМ "ДАТЬ В РЕПУ" !!!  smile 


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


Опытный
**


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

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



Раньше тоже использовал что-то типа этого. Только это все было написано на листочке в тетрадке. А тут в Visual Studio 2005 появилась диаграмма классов. Прикольная штучка. smile  Тока вчера начал пользоваться. Вчера за 2 часа написал логику работы средненькой программки. Раньше на это уходило 1-2 дня (и то в конце концов она кардинально менялась). Правда все же есть некоторые ограничения, но ничего.


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


Эксперт
****


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

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



Добавлю несколько важных замечаний к коду thomas'а.

Цитата
Какие атрибуты должен содержать класс, это типа местные переменные. При наименовании полезно двать префикс "m". Так ты будешь четко знать что эта переменная внутри класса.


Переменные класса принято именовать полями. Атрибуты - это кое-что другое.
Насчёт префиксов - можно, но всё-таки код выглядит лучше, если вместо m использовать, например, знак подчёркивания (_).

Цитата
Public Class имя класса ' желательно с префиксом cls


Так было принято в VB6. В VB .NET и других ОО языках никаких префиксов не используется - взгляни ан классы .NET Framework.


Цитата
mФамилия, mИмя As String


Использовать русские символы в идентификаторах - не лучшее решение.

Цитата
Раньше на это уходило 1-2 дня (и то в конце концов она кардинально менялась).


Пока люди не попробуют проектировать программу перед её написанием, они никогда не верят, что так проще smile . Особенно, VB .NET-чики.

Добавлено @ 15:00 
P.S. В 2005-ой студии можно твой кусок кода сделать шаблоном (code snippet) и потом вставлять в любом месте прямо из редактора кода smile .
PM   Вверх
thomas
Дата 9.10.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Exception
Приветствую.
Attribute это и есть, в принципе, "поля". Просто, похоже, русские программисты используют слово поля (английское field я в классах не втречал), а забугорные используют слово атрибуты.
Еще одно: методы и субрутины (в C# еще void) это суть одно и тоже, а вот функция это уже другое. Функция не только производит определенные действия, она еще и возвращает результат заданного типа, в отличие от методы(субрутины)

По поводу префикса для переменных в классе часто встречается и "_" , с этим согласен.
Просто наш препод предложил нам нотацию с "m" и для имен классов в VB префикс cls, а в C# соответственно cl.
Наверное это можно и не использовать, но когда в коде формы ты обьявляешь  новый экземпляр класса, лично мне, с префиксом имя класса понятнее. Это явно указывает на класс.

Еще одно замечание по поводу наименования идентификаторов.
Имена полей(атрибутов) пишут с маленькой буквы, а вот свойства(Propertie) с заглавной.

И конечно я не использую кириллицу в идентификаторах. Я учусь на Нидерландском. И потому в кодировании употребляю существительные и глаголы из Нидерландского.
А тут так написал что бы человек понял логику построения класса. Но для более серьезного и "правильного" подхода к программированию, мне нужно учить Английский и использовать английские существиетльные и глаголы. Хотя здесь во всех, там где я побывал, школах кодируют на Нидерландском и ничего, все счастливы.  smile 




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
DarkDragon
Дата 9.10.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


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

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



Цитата

ТАК ХОЧЕТСЯ ВСЕМ "ДАТЬ В РЕПУ" !!!  smile  

Типа в знак благодарности?smile
PM MAIL   Вверх
DarkDragon
Дата 9.10.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


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

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



Насчет аттрибутов. В языках .NET, мелкософт им отвела другую роль. А именно роль некого дополнительного свойства обьекта(под обьектом понимается классы, структуры, переменные, процедуры).

Атрибуты прикручивают следубщим способом:
Код

   <Serialization()>Class MyClass

   End Class


В C#, так:
Код

  [Serialization()]class MyClass
  {

  }


Например одно из применений атрибутов служит декларация функций из библиотек:
Код

  <DllImport("user32.Dll")>Public Function ShowWindow (nCmdShow As Integer) As Integer
  End Function


Еще для того чтобы поля структур, при выполнении программы, стояли друг за другом, можно применить следующий атрибут:
Код

  <StructLayout(LayoutKind.Sequential)> Public Structure APIPoint
    Public X As Integer
    Public Y As Integer
End Structure

В частности так делают, для передачи структур, в API функции(т. к. в таких библиотеках поля структур идут друг за другом, как описано в самом коде, а в .NET поля структур располагаются случайным образом).


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


Эксперт
****


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

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



Цитата(thomas @  9.10.2006,  17:44 Найти цитируемый пост)
Attribute это и есть, в принципе, "поля". Просто, похоже, русские программисты используют слово поля (английское field я в классах не втречал), а забугорные используют слово атрибуты.


Как правильно выше написал DarkDragon, именно в .NET атрибуты - это специальные штучки, присоединяющиеся к классу/методу/etc - метаданные, короче. Поэтому переменные уровня класса называют полями.

Цитата(thomas @  9.10.2006,  17:44 Найти цитируемый пост)
Еще одно: методы и субрутины (в C# еще void) это суть одно и тоже, а вот функция это уже другое. Функция не только производит определенные действия, она еще и возвращает результат заданного типа, в отличие от методы(субрутины)


Метод - логически ограниченный кусок кода, выполняющий некоторую задачу и (необязательно) принимающий некоторые входные параметы (немного упрощённое определение, но суть отражена smile ).

Процедура [subroutine] - это метод, не возвращающий никакого значения.

Функция - это метод, возвращающий значение smile . Вот и всё.
PM   Вверх
DarkDragon
Дата 11.10.2006, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


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

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



Я вот посмотрел на шаблон класса, и подумал предложить свою версиюsmile
Ничего против комментариев не имею, но если мы пишим код в VS.NET, то
я думаю лучше будеть использовать регионы.

Пример:

Код

#Region "Private Variables"
    ' Переменные для частного пользования
    Private pVar1 As Integer
    Private pVar2 As String
    ...
#End Region

#Region "Public Properties"
    ' Публикация свойств
    Public Property Var1() As Integer
        ...
    End Property
    
    Public Property Var2() As String
        ...
    End Property
#End Region

#Region "Constructors"
    ' Конструкторы класса
    Public Sub New()
    End Sub

    Public Sub New(...)
        ...
    End Sub
#End Region

#Region "Public Functions"
    ' Публикация функций
    Public Function Func1() As Integer
        ...
    End Function

    Public Function Func2() As String
        ...
    End Function
#End Region


Почему я так думаю? Потому что Регионы можно сварачивать(все одним кликом, в один прямоугольник, внутри которого распологается текст
описанный в ковычках)smile
А комментарии направить к региону, или можно оставить так как они естьsmile

Конечно в маленьких проектах, вполне можно обойтись, а вот в большущих, я думаю
что очень сильно помогут, если с умом давать им именаsmile

Наверное для этого мелкософт и ввела понятие регионы (область содержащая конкретные данные, это так сказать придумал я русское определение регионамsmile)

PM MAIL   Вверх
thomas
Дата 11.10.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



DarkDragon, привет.
Вообще я тоже последний год стал практически постоянно использовать Region как в C# так и в VB. Действительно удобно. Когда упражнения были короткими и простыми, нужды не было. А вот сечас, код на форму до 400-500 строк. Ну и пихаю все относящееся к одному логическому блоку в Region.
А про класс, это я для себя  такой шаблончик сделал. Когда код готов, я эти коментарии удаляю. А вообще надо начинать программировать с листа бумаги, а потом уже код писать в студии.



Это сообщение отредактировал(а) thomas - 11.10.2006, 23:40


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Exception
Дата 11.10.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ага, регионы - удобная и полезная штуковина smile .
P.S. thomas, можешь мне поверить на слово, а можешь и сам проверить, что аналогом русского "поля" является английское слово field, и это не прихоть русских программистов smile .

Добавлено @ 23:29 
thomas, одна тема - один вопрос. Создай новую тему.
PM   Вверх
thomas
Дата 11.10.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Exception
А я про что, где в классе у англоязычных можно найти Field? Attribute без проблем, а вот field?

Да в принципе, главное чтоб человек понял, что есть эти "поля" и для чего они нужны. smile 



Это сообщение отредактировал(а) thomas - 11.10.2006, 23:40


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Exception
Дата 11.10.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



http://en.wikipedia.org/wiki/Field_(computer_science)

И всё-таки, комментарии - это отдельный вопрос, и необходимо создать отдельную тему.

Это сообщение отредактировал(а) Exception - 11.10.2006, 23:38
PM   Вверх
thomas
Дата 11.10.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Exception
про поля убедил.  smile 

Это сообщение отредактировал(а) thomas - 11.10.2006, 23:41


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
DarkDragon
Дата 12.10.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


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

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



thomas, здарова!

Немного в оффтоп, Exception не ругайсяsmile
thomas, создавай новую тему(хотя я и не понял про что, но обсудим)smile

По поводу класса готовлю всем VB.NET'чикам сюрприз. Надеюсь что он хоть кому нибудь пригодитсяsmile
Вообщем ждите новой темыsmile
PM MAIL   Вверх
Exception
Дата 14.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, так мы ждём двух тем уже smile .
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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