Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB .NET > Научите работать с классами в VB.NET ! |
Автор: mihanik 5.10.2006, 08:11 |
Привет! Сегодня установил себе студию. Сижу читаю всяко разно... http://www.ishodniki.kiev.ua/doc/lesson/vbnetbook.php много интересного. Но там при объяснении часто используется понятие класса... Раньше немного программировал на VB6. Но классы не использовал. Кто-нибудь сможет на пальцах объяснить для особо одарённых понятие класса? ![]() |
Автор: Pankon 5.10.2006, 15:21 |
Если уж совсем просто, то класс это шаблон, по образу и подобию которого можно создавать любое количество обьектов... |
Автор: ivashkanet 5.10.2006, 15:23 |
mihanik, давай конкретные вопросы. Не хочешь же ты, чтобы мы тебе новую собственноручно написанную статью дали ![]() |
Автор: Hidrag 5.10.2006, 15:26 |
Тебе нужно разобраться с теорией объектно ориентированного программирования, тогда все поймешь, что такое класс что такое экземпляр, и языки программирования для тебя будут различаться только синтаксисом. |
Автор: DarkDragon 5.10.2006, 18:01 | ||||||||||
В VB.NET есть понятие класс и структура. Вот тока совсем не понимаю из чего состоит класс (с точки зрения самого процессора), но знаю как его кушать. Структуры и классы в VB.NET могут содержать в себе функции(function/sub), переменные(variables), случаи(events), проперции(properties). Одно из отличий класса и структуры, это то что класс передается по ссылке, а структура по значению. Чтобы создать свой класс, много ума не требуется:
Public/Private/Protected/Friend - радиус видимости ![]() одно из причин реализации классов это унаследование. Чтобы унаследовать какой нибудь класс тебе нужно использовать ключевое слово Inherits
Конструктор в VB.NET, процедура New.
Чтобы использовать данные класса, нужно создать новый класс.
Но можно обойтись и без создания нового класса, если данные в классе обьявлены как Shared в VB, тоже что и static в C++, C#.
Ешо можно приделать интерфэйс. Но сам не доганяю для чего он нужен. Возможно Interface - это скелет класса? Или основа? А может что то и другое... Ну это не все что можно делать с классом. Если ты создашь Windows Application, то автоматически получишь форму Form1. Это как раз и есть класс, унаследующий класс Form. А если тебе нужна тока теорию, то прямо в MSDN. Тама се про класс и написано. |
Автор: Exception 5.10.2006, 18:17 |
Эй-эй, нет смысла изучать, как объявлять классы, если не знать теории ООП. Так ты только сделаешь хуже для самого себя. А вообще, класс - это абстракция объекта реального мира, используемая в программе. |
Автор: DarkDragon 5.10.2006, 19:15 |
Если мне память не отшибло, то в первые классы стали реализоваваться в C, а унаследования в C++. И при чем тут понятие класс и ООП. Если я не ошибаюсь ООП использует класс как обьект, со всеми прилагающими услугами (Properties, Events, ....). |
Автор: mihanik 6.10.2006, 06:52 |
Хм... Не могу понять, кто пометил данный вопрос, как решённый... ![]() Это, по крайней мере, не вежливо. По-моему, только человек поднявший вопрос может определить, решён вопрос или нет. Это как буд-то мне дали понять, что я тру-ля-ля негожее... Обидно, знаете ли! Добавлено @ 06:55 Спасибо, thomas и DarkDragon! Если будут появлятся вопросы, можно их задавать в письме? |
Автор: mihanik 6.10.2006, 07:08 |
Кстати! Вотhttp://www.gotdotnet.ru/LearnDotNet/VBNET/125221.aspx(http://www.gotdotnet.ru/LearnDotNet/VBNET/125221.aspx) кое-что интересное написано про ООП и классы... |
Автор: ivashkanet 6.10.2006, 10:34 | ||||||||||
Когда я только начал изучать C# мне попалось примерно такое объсянение:
Тогда оно мне было не очень понятно, а сейчас я считаю, что лучше его и не придумаешь. Пример:
Теперь можно создать метод, который будет "заставлять" считаться классы которые умеют это делать:
Либо можно объединять все объекты реализующие этот интерфейс в один масив и работать с ними всеми как с объектами одного типа:
Вот, в принципе, все про интерфейсы. |
Автор: Exception 6.10.2006, 20:25 | ||||||||||||||||||
Советую почитать, http://wiki.vingrad.ru/index.php/ООП:Класс. По сути, класс объявляется так:
Внутри класса могут находиться поля, методы, свойства и события. В полях хранят данные класса. Например, можно объявить класс Point, представляющий точку, и для хранения координат использовать поля X и Y:
Прекрасно, мы можем хранить данные. Но как быть с операциями, которые класс должен выполнять? Для объявления и реализации таких операций исполльзуются методы (также называемые процедурами или функциями).
Методы могут принимать параметры - они выглядят как локальные переменные, но передаются из внешнего кода. Могут они и возвращать значения внешнему коду - тогда вместо ключегого слова Sub указывается ключевое слово Function, а в конце приписывается As тип_возвращаемого_значения.
Использовать этот метод можно так:
Зачастую полей бывает вполне достаточно. А что если нужно как-то ограничить диапазон присваиваемых полям значений? Можно создать специальные функции, отвечающие за присваивание и возвращение значения поля, но проще воспользоваться встроенными средствами - свойствами. Обращение к свойству внешне не отличается от обращения к полю, разве что на самом деле выполняется дополнительный код:
События - более сложная тема, и для начала тебе следует понять всё вышесказанное. Далее, один класс может наследоваться от другого, расширяя его функциональность и при необходимости перепределяя её. Внимание: наследовать стоит только тогда, когда наследник моделирует отношение "is-a", то есть является какой-то разновидностью базового класса! Например, гипотетический класс Human (человек) мог бы наследовать от Animal (животное) или класс Triangle (треугольник) - от Figure (фигура), но нелогично наследовать квадрат от точки только потому что их определяют два числа - координаты у точки и длины сторон у квадрата. Треугольник является фигурой, но квадрат не является точкой. Это важно понять. Чтобы унаследовать от другого класса, необходимо употребить ключевое слово Inherits. По умолчанию все классы наследуют от System.Object.
Мы использовали в коде три новых модификатора. MustOverride указывает, что класс не реализует данный метод, а оставляет эту обязанность своим потомкам. Именно поэтому такой класс "без метода" создать с помощью оператора New нельзя - и он помечается как MustInherit. Потмки должны либо предоставить реализацию метода, либо также оставаться MustInherit. Все объекты можно привести к типу базового класса, хотя операции и разные для разных наследников. Пример:
Хотя, по сути, мы вызывали метод класса Animal, он был замещён своими переопределениями в классах Dog и Cat, и, как и ожидалось, код выводит на консоль
Всё, честно говоря, я немного устал сегодня, и если тебя заинтересовало всё это, советую сначала почитать о таких принципах ООП как инкапсуляция, полиморфизм, об абстрактных классах, а затем уже начинать применять всё это добро в VB .NET. Тогда и учить другие языки впоследствии будет существенно проще. |
Автор: DarkDragon 6.10.2006, 23:52 | ||||||||||||||||||
Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера.
Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можно ![]()
Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface.
![]() Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал начало ![]() Добавлено @ 23:58 Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера.
Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можно ![]()
Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface.
![]() Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал начало ![]() Добавлено @ 23:59 Во! Exception обьяснил то что я написал, более понятно, и немного по подробнее. А что же ты про templates ничего не сказал? У меня в 2003 версии не подерживается в VB. Зато знаю что подерживается в 2005. Это даже видно из твоего примера.
Незнаю как другим, а мне можно. Еще лучше если на мою почту. Ну и на Vingrad'е(личный ящик) тоже можно ![]()
Точно. Если мы вкачестве параметра укажем interface, то можно будет передать любой класс, который поддерживает данный interface.
![]() Насчет ООП. Не смог прочесть на Wiki. Тупо грузит белый фон и замертво стоит(попробовал линк скачать через Downloader, скачал начало ![]() |
Автор: DarkDragon 7.10.2006, 00:10 | ||
_____________ Не обращайте внимание на 3 добавки в мой ответ ![]()
Это происходит потому что, вызывается ошибка в mscorlib. Основной класс вызова: Exception. После инструкции Catch Ex As Exception. Вызывается Exception. Он резко смотрит вопрос, где поставил последний пост (на Vingrade=>.NET=>VB.NET), и помечает его как труе (Решенный = True). Тебе надо отправить письмо в мелкософт. Чтобы исправили баг ![]() ![]() Это Exception помечает сообщения как решенные. А вообщем не обращай на это. Не кто тебя не принемает за тру ля ля. Все когда-то начинали, и все когда-то что-то забывали.... |
Автор: Exception 7.10.2006, 11:45 | ||||||||||||||
Ну привычка отмечать решённым ![]() Часто бывает необходимо объявить в коде список элементов:
![]() |
Автор: mihanik 8.10.2006, 13:59 |
Ребята!!! Огромное спасибо!!! ![]() Не думал, что получу столько интересной информации!!! Теперь даже как-то стыдно не разобраться во всём этом... Отдельное спасибо thomas за то письмо, которое он мне прилал на личный ящик. Его можно хоть в ФАК выкладывать, хоть куда!!! ПРОСЬБА К МОДЕРУ!!! thomas не отметился в этом посте, но всё равно очень мне помог в изучении поднятой темы. Сделайте ему "+" в репутацию!!! Ещё раз всем спасибо!!! |
Автор: ivashkanet 8.10.2006, 14:12 | ||
А сам сделать не сможешь? У тебя же 300 постов. Найди любой его пост и дай плюс ![]() |
Автор: mihanik 8.10.2006, 14:26 |
ivashkanet, Рассматривал такую возможность, но пока её отверг. Я не хочу за какой-нибудь пост! ![]() Я хочу именно за этот!!! ![]() Мы (белые медведи) простых решений не ищем!!! ![]() |
Автор: ivashkanet 8.10.2006, 15:24 |
А чем тебе модератор помочь может???? Он ведь не сможет создать тут пст за Томаса ![]() И вообще: "заныканый ФАК в студию" |
Автор: $tatic 8.10.2006, 16:17 | ||
Стукни Томасу в ПМ, попроси пусть письмо выложит. Тогда сразу обе проблемы и решатся ![]() |
Автор: thomas 8.10.2006, 17:05 | ||||
Всем привет. Я сам пользуюсь и другим предлогаю попробовать. Для удобства написания класса логично использовать шаблон. Я его сохранил в txt файл и копирую в добавленный в проект класс. А потом начинаю в соответствии с задачей писать код. Вот как это примерно выглядит. Коментарии и есть шаблон.
В данном классе не прописаны методы и события. В качестве методов могут выступать как субрутины, так и функции. Для событий мы должны сначала обьявить событие, а потом описать метод его вызывающий. Вот здесь можно прочитать об этом. http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vblr7/html/vastmevent.asp Кстати прочитать про интерфейсы можно в русской MSDN http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcn7/html/vaconInterfaces.asp |
Автор: DarkDragon 8.10.2006, 23:36 | ||
Шота я не понял, разве нельзя добавлять плюсы или минусы, если ниже 300? |
Автор: mihanik 9.10.2006, 07:45 | ||
А вот то письмо, которое thomas прислал мне.
Добавлено @ 07:46 БЛИН!!!!! ТАК ХОЧЕТСЯ ВСЕМ "ДАТЬ В РЕПУ" !!! ![]() |
Автор: Naum 9.10.2006, 10:30 |
Раньше тоже использовал что-то типа этого. Только это все было написано на листочке в тетрадке. А тут в Visual Studio 2005 появилась диаграмма классов. Прикольная штучка. ![]() |
Автор: Exception 9.10.2006, 14:51 | ||||||||
Добавлю несколько важных замечаний к коду thomas'а.
Переменные класса принято именовать полями. Атрибуты - это кое-что другое. Насчёт префиксов - можно, но всё-таки код выглядит лучше, если вместо m использовать, например, знак подчёркивания (_).
Так было принято в VB6. В VB .NET и других ОО языках никаких префиксов не используется - взгляни ан классы .NET Framework.
Использовать русские символы в идентификаторах - не лучшее решение.
Пока люди не попробуют проектировать программу перед её написанием, они никогда не верят, что так проще ![]() Добавлено @ 15:00 P.S. В 2005-ой студии можно твой кусок кода сделать шаблоном (code snippet) и потом вставлять в любом месте прямо из редактора кода ![]() |
Автор: thomas 9.10.2006, 16:44 |
Exception, Приветствую. Attribute это и есть, в принципе, "поля". Просто, похоже, русские программисты используют слово поля (английское field я в классах не втречал), а забугорные используют слово атрибуты. Еще одно: методы и субрутины (в C# еще void) это суть одно и тоже, а вот функция это уже другое. Функция не только производит определенные действия, она еще и возвращает результат заданного типа, в отличие от методы(субрутины) По поводу префикса для переменных в классе часто встречается и "_" , с этим согласен. Просто наш препод предложил нам нотацию с "m" и для имен классов в VB префикс cls, а в C# соответственно cl. Наверное это можно и не использовать, но когда в коде формы ты обьявляешь новый экземпляр класса, лично мне, с префиксом имя класса понятнее. Это явно указывает на класс. Еще одно замечание по поводу наименования идентификаторов. Имена полей(атрибутов) пишут с маленькой буквы, а вот свойства(Propertie) с заглавной. И конечно я не использую кириллицу в идентификаторах. Я учусь на Нидерландском. И потому в кодировании употребляю существительные и глаголы из Нидерландского. А тут так написал что бы человек понял логику построения класса. Но для более серьезного и "правильного" подхода к программированию, мне нужно учить Английский и использовать английские существиетльные и глаголы. Хотя здесь во всех, там где я побывал, школах кодируют на Нидерландском и ничего, все счастливы. ![]() |
Автор: DarkDragon 9.10.2006, 16:48 | ||
Типа в знак благодарности? ![]() |
Автор: DarkDragon 9.10.2006, 18:44 | ||||||||
Насчет аттрибутов. В языках .NET, мелкософт им отвела другую роль. А именно роль некого дополнительного свойства обьекта(под обьектом понимается классы, структуры, переменные, процедуры). Атрибуты прикручивают следубщим способом:
В C#, так:
Например одно из применений атрибутов служит декларация функций из библиотек:
Еще для того чтобы поля структур, при выполнении программы, стояли друг за другом, можно применить следующий атрибут:
В частности так делают, для передачи структур, в API функции(т. к. в таких библиотеках поля структур идут друг за другом, как описано в самом коде, а в .NET поля структур располагаются случайным образом). |
Автор: Exception 10.10.2006, 16:51 | ||||
Как правильно выше написал DarkDragon, именно в .NET атрибуты - это специальные штучки, присоединяющиеся к классу/методу/etc - метаданные, короче. Поэтому переменные уровня класса называют полями.
Метод - логически ограниченный кусок кода, выполняющий некоторую задачу и (необязательно) принимающий некоторые входные параметы (немного упрощённое определение, но суть отражена ![]() Процедура [subroutine] - это метод, не возвращающий никакого значения. Функция - это метод, возвращающий значение ![]() |
Автор: DarkDragon 11.10.2006, 23:12 | ||
Я вот посмотрел на шаблон класса, и подумал предложить свою версию![]() Ничего против комментариев не имею, но если мы пишим код в VS.NET, то я думаю лучше будеть использовать регионы. Пример:
Почему я так думаю? Потому что Регионы можно сварачивать(все одним кликом, в один прямоугольник, внутри которого распологается текст описанный в ковычках) ![]() А комментарии направить к региону, или можно оставить так как они есть ![]() Конечно в маленьких проектах, вполне можно обойтись, а вот в большущих, я думаю что очень сильно помогут, если с умом давать им имена ![]() Наверное для этого мелкософт и ввела понятие регионы (область содержащая конкретные данные, это так сказать придумал я русское определение регионам ![]() |
Автор: thomas 11.10.2006, 23:26 |
DarkDragon, привет. Вообще я тоже последний год стал практически постоянно использовать Region как в C# так и в VB. Действительно удобно. Когда упражнения были короткими и простыми, нужды не было. А вот сечас, код на форму до 400-500 строк. Ну и пихаю все относящееся к одному логическому блоку в Region. А про класс, это я для себя такой шаблончик сделал. Когда код готов, я эти коментарии удаляю. А вообще надо начинать программировать с листа бумаги, а потом уже код писать в студии. |
Автор: Exception 11.10.2006, 23:27 |
Ага, регионы - удобная и полезная штуковина ![]() P.S. thomas, можешь мне поверить на слово, а можешь и сам проверить, что аналогом русского "поля" является английское слово field, и это не прихоть русских программистов ![]() Добавлено @ 23:29 thomas, одна тема - один вопрос. Создай новую тему. |
Автор: thomas 11.10.2006, 23:31 |
Exception, А я про что, где в классе у англоязычных можно найти Field? Attribute без проблем, а вот field? Да в принципе, главное чтоб человек понял, что есть эти "поля" и для чего они нужны. ![]() |
Автор: Exception 11.10.2006, 23:35 |
http://en.wikipedia.org/wiki/Field_(computer_science) И всё-таки, комментарии - это отдельный вопрос, и необходимо создать отдельную тему. |
Автор: thomas 11.10.2006, 23:40 |
Exception, про поля убедил. ![]() |
Автор: DarkDragon 12.10.2006, 00:17 |
thomas, здарова! Немного в оффтоп, Exception не ругайся ![]() thomas, создавай новую тему(хотя я и не понял про что, но обсудим) ![]() По поводу класса готовлю всем VB.NET'чикам сюрприз. Надеюсь что он хоть кому нибудь пригодится ![]() Вообщем ждите новой темы ![]() |
Автор: Exception 14.10.2006, 13:32 |
Ну, так мы ждём двух тем уже ![]() |