2009-11-23 2 views
1

Я новичок в vb.net и очень разочарован.Основные вопросы о классах, модулях и взаимодействии

Как и все хорошие программисты, я хочу разбить мой код на отдельные файлы на основе функциональности. Некоторые из моего кода взаимодействуют с пользователями через Forms, а некоторые взаимодействуют с лабораторным оборудованием за кулисами (без прямого взаимодействия с пользователем). Иногда пользователь может изменить что-то, что повлияет на лабораторное оборудование, и иногда что-то произойдет с лабораторным оборудованием, о котором должен знать пользователь. Когда я использую VS для создания файлов, я должен выбрать модуль или форму. VS затем создает пустой файл с с либо

Открытый класс Foo

End Class

или

Модуль Foo

End Module

Если у меня есть куча файлы, каждый модуль, и если я определяю подпрограммы в модуле для Друга, тогда я могу назвать их из других модулей, поэтому:

Модуль Foo

Friend Sub DoSomeWork() 

End Sub 

End Module

код в Фее может вызывать процедуры в Foo -

Модуль Плата

Friend Sub Stuff() 

DoSomeWork() 

End SUb 

End Module

Когда я создаю Форма, VS cre занял класс. Я нахожу, что я могу вызывать подпрограммы, определенные в модуле из класса, но когда я пытаюсь позвонить из модуля в класс, я получаю сообщение об ошибке, которую не запускает программа, которую я пытаюсь вызвать. Я также не могу звонить из одного класса в другой класс. Объявления, как представляется, применяются только к библиотечным программам вне моей программы.

Я просмотрел несколько онлайн-объяснений и руководств, но, честно говоря, я не понимаю их и не забочусь о «наследовании от базового класса» и всех других gobbledygook, которые содержат такие «объяснения». Я хочу сосредоточиться на создании моего приложения.

Моей Главная форма имеет название «Main»

Я попытался положить весь код модуля в основном класс первый переименования «Module Foo» в «Открытый частичном классе Main» - плохая идея - создает impossible- чтобы найти дублирующуюся ошибку. Я пробовал создавать пустые файлы кода, определяя их как Public Partial Class Main и вставляя в них код модуля, - это сработало в этом коде в Class Main, можно было бы вызвать код модуля (который теперь находился в Main) и наоборот , но другие Формы (конечно, у меня более одного) создаются VS, чтобы иметь свои собственные Классы, и как только код «Module» переносится из модулей в Class Main, другие Forms (Classes) больше не могут вызывать код ,

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

ОТВЕТ снизу

Чтобы вызвать подпрограмму в другом классе вам нужно просто поставить имя класса перед именем подпрограммы.

Так не

DoSomeWork()

но

Foo.DoSOmeWork()

Это может быть очевидным для вас всех опытных программистов, но не ко мне. Вам не нужно добавлять имя класса/модуля к вызову Module-to-Module или вызову Class-to-Module, только для вызовов, которые производятся в классах. Лично, ради последовательности, я думаю, что все должно быть одинаково, но это, вероятно, нарушит какое-то правило OO. В любом случае, спасибо всем.

+2

Говорит, как VB кодер ... –

+0

Я предлагаю вам оставить VB и изучить вариант C (C# .NET с момента ее и то, что вы узнали до сих пор могут быть применены в C#) – Omar

ответ

0

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

Public Class Form1 
public sub test(i as integer) 
... 
end sub 
end class 

, а затем вы можете назвать это, обращаясь к классу .subname:

call form1.test(7) 
+0

Спасибо! Спасибо! Спасибо! – NormD

0

NomD,

Как и все хорошие программисты

вы действительно должны заботиться

о "наследовании от базового класса" и всех других абракадаброй, что такие "объяснения"

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

+0

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

+0

@NormD: У вас довольно хорошая запись, и я читаю ее несколько раз, но я до сих пор не совсем понимаю, в чем проблема. Трудно сказать, создаете ли вы экземпляры классов или вызываете статические методы и т. Д. Какой-то фактический вывод кода и ошибок будет полезен. –

-1

Похоже, вы не понимаете основ объектно-ориентированного программирования (ООП).

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

Другой вариант - узнать ООП, выбрав книгу об этом или следуя курсу или учебнику по этому вопросу. Это значительные инвестиции, но это приведет к созданию более надежного кода, который будет лучше масштабироваться, когда ваше приложение будет расти.

+0

Мое приложение не нуждается в масштабировании, а ремонтопригодность в это время не является обязательным (это прототип). Я только создавал Модули, но мне пришлось добавить некоторые Формы и Формы, добавленные как Классы, поэтому мне нужно кодировать в Классах взаимодействие с кодом в Модулях. Я прочитал книги об ООП, и я сделал учебники, но они всегда, похоже, имеют дело с вещами на абстрактном уровне, который терпит неудачу, когда вам нужно выполнить реальную работу. Мне напомнили о пурификаторах базы данных, которые настаивают на том, что все будет третьей нормальной формой ... Спасибо, что ответили. – NormD

+0

Причина для downvote: не затрагивает вопрос. Это скорее мнение, которое было бы лучше в комментарии. – xpda

+0

xpda: Спасибо, что оставили повод для вашего downvote. Я собирался отредактировать с объяснением его конкретной проблемы, но я вижу, что вы решили его проблему ;-) –

0

Я не уверен, почему у двух комментаторов, похоже, проблема с VB.Net. Вопрос будет одинаковым независимо от языка, поскольку оба являются C# и VB построены на .Net. Код может быть плохо написан на C#, как и VB. Пожалуйста, оставьте языковые войны дома. NormD, ответ на ваш вопрос должен действительно направлять вас на ресурсы, необходимые для лучшего понимания проблемы. Вот статья о сфере, которая может немного помочь - class scope. Причина, по которой вы получаете поведение, которое вы видите, связано с тем, с чем вы работаете.Модули (похожие на статические классы в C#) создаются при запуске программы, поэтому их не нужно создавать. Таким образом, вы можете ссылаться на метод на модуле, например: module.method. Классы, с другой стороны, некоторые исключения, должны быть созданы для ссылки. Поэтому для использования сотрудника (или класса формы) вы должны создать переменную этого класса. Таким образом, вы будете использовать dim myemp как New Employee(), а затем вызовите myemp.method() из своего модуля. Это довольно упрощенное описание, поэтому, пожалуйста, ознакомьтесь с областью статьи и другими статьями MSDN для получения дополнительной информации. Я уверен, что другие плакаты могут размещать дополнительные ссылки с хорошей информацией. Надеюсь это немного поможет.

Wade

Смежные вопросы