【问题标题】:Basic questions about Classes, Modules and interaction关于类、模块和交互的基本问题
【发布时间】:2010-12-19 15:21:25
【问题描述】:

我是 vb.net 的新手,非常沮丧。

像所有优秀的程序员一样,我想根据功能将我的代码拆分为单独的文件。我的一些代码通过表单与用户交互,一些在幕后与实验室设备交互(没有直接的用户交互)。有时用户会改变一些会影响实验室设备的东西,有时用户需要注意的实验室设备会发生一些事情。当我使用 VS 创建文件时,我必须选择一个模块或表单。然后 VS 创建一个空文件,其中包含一个

公开课 Foo

结束类

模块 Foo

结束模块

如果我有一堆文件,每个文件都是一个模块,并且如果我在一个模块中定义例程成为朋友,那么我可以从其他模块调用它们,所以:

模块 Foo

Friend Sub DoSomeWork()

End Sub

结束模块

Fee 中的代码可以调用 Foo 中的例程 -

模块费用

 Friend Sub Stuff()

 DoSomeWork()

 End SUb

结束模块

当我创建表单时,VS 会创建一个类。我发现我可以从一个类调用一个模块中定义的子例程,但是当我尝试从一个模块调用一个类时,我收到一个错误,我试图调用的例程没有声明。我也不能从一个班级呼叫另一个班级。声明似乎只适用于我的程序之外的库例程。

我浏览了几个在线解释和教程,但坦率地说,我不理解这些,也不关心“从基类继承”以及这些“解释”包含的所有其他 gobbledygook。我想专注于构建我的应用程序。

我的主窗体的名称为“Main”

我尝试通过将“Module Foo”重命名为“Public Partial Class Main”首先将所有模块代码放入主类 - 坏主意 - 会产生无法找到的重复错误。我尝试创建空代码文件,将它们定义为公共部分类主并将模块代码放入其中,这在主类中的代码中有效,可以调用“模块”代码(现在在主中),反之亦然,但是,其他表单(当然我有多个)是由 VS 创建的以拥有自己的类,一旦“模块”代码从模块移到主类中,其他表单(类)就不能再调用代码了.

我只想要一些我可以遵循的方法(最佳实践)来定义模块和类,以便可以共享代码和数据。

下面的回答

要调用另一个类中的子例程,您只需将类名放在子例程名称的前面。

所以没有

DoSomeWork()

但是

Foo.DoSOmeWork()

这对你们所有有经验的程序员来说可能很明显,但对我来说不是。您不必在模块到模块调用或类到模块调用之前添加类/模块名称,只需添加到类中的调用即可。就个人而言,为了一致性,我认为事情应该是一样的,但它可能会违反一些 OO 规则。总之谢谢大家。

【问题讨论】:

  • 我建议你离开VB,学习一个C变体(C#,因为它的.NET和你目前所学的可以在C#中应用)

标签: vb.net winforms


【解决方案1】:

一般来说,如果你有一个函数需要从多个表单中调用,或者从表单和模块中调用,把它放在主模块中。如果你有特殊情况,需要从另一个表单或模块调用一个表单中的函数或子函数,你可以将其声明为 public:

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

然后你可以通过引用class.subname来调用它:

call form1.test(7)

【讨论】:

  • 谢谢!谢谢!谢谢!
【解决方案2】:

名义博士,

像所有优秀的程序员一样

你确实应该关心

关于“从基类继承”以及所有其他类似“解释”的 gobbledygook

这将使您成为一名更好的程序员,花时间理解为什么正确的代码结构很重要也将开始为您带来更好的结果。

【讨论】:

  • 那么,您了解 OOP,对吗?所以请解释为什么我不能从一个模块调用一个类。
  • @NormD:你写了很多,我读了好几遍,但我还是不太明白问题出在哪里。很难说你是在实例化类还是调用静态方法等。一些实际的代码和错误输出会很有用。
【解决方案3】:

我不确定为什么两个评论者似乎对 VB.Net 有问题。无论使用哪种语言,问题都是相同的,因为 C# 和 VB 都是基于 .Net 构建的。就像 VB 一样,用 C# 编写代码可能很糟糕。请把语言战争留在家里。 NormD,您的问题的答案应该是指导您更好地理解问题所需的资源。这是一篇关于范围的文章,可能会有所帮助 - class scope。你得到你看到的行为的原因是你正在使用的东西。模块(类似于 C# 中的静态类)是在您开始编程时创建的,因此无需创建它们。因此,您可以引用模块上的方法,例如 - module.method。另一方面,类,一些例外,需要创建才能被引用。因此,要使用员工(或表单类),您必须创建该类的变量。因此,您将使用 dim myemp 作为 New Employee(),然后从您的模块中调用 myemp.method()。这是一个相当简单的描述,因此请阅读范围文章和其他 MSDN 文章以获取更多信息。我相信其他海报可以发布带有良好信息的附加链接。希望这会有所帮助。

韦德

【讨论】:

    【解决方案4】:

    您似乎不了解面向对象编程 (OOP) 的基础知识。

    如果您不想学习如何以面向对象的方式设计应用程序,那么只需在应用程序中创建模块,您就可以毫无问题地从一个函数调用到另一个函数。但这会导致代码不易维护和扩展。

    另一种选择是通过选择一本书来学习 OOP,或者学习有关该主题的课程或教程。这是一项重大投资,但它会产生更健壮的代码,当您的应用程序增长时可以更好地扩展。

    【讨论】:

    • 我的应用程序不需要扩展,此时的可维护性不是要求(这是一个原型)。我只是创建模块,但我必须添加一些表单,并且表单作为类添加,所以我需要类中的代码与模块中的代码交互。我读过关于 OOP 的书籍,也做过教程,但这些似乎总是在抽象层面上处理当你必须完成实际工作时失败的事情。我想起了坚持一切都是第三范式的数据库纯粹主义者......谢谢你的回复。
    • 投反对票的原因:没有解决问题。这更像是一种意见,在评论中会更好。
    • xpda:感谢您留下投票的理由。我正要对他的具体问题进行编辑,但我看到你解决了他的问题;-)
    猜你喜欢
    • 2011-05-31
    • 2011-03-14
    • 2021-03-22
    • 1970-01-01
    • 2016-10-23
    • 2018-04-19
    • 1970-01-01
    • 2014-01-03
    • 2013-10-10
    相关资源
    最近更新 更多