很难让我的头脑明白OOP(C#)
很长一段时间以来,我一直在使用Lua等非OOP语言(主要是脚本或web开发)。我现在在C#方面已经相当先进了,但就我目前的项目而言,我遇到了困难 我正在制作一种游戏,你可以用各种各样的东西制作一个2D环境 我正在使用一个在web上找到的将XNA移植到winform的示例,它工作得非常完美,没有延迟或任何问题 但那不是我的问题。我完全不知道如何使一个实例类与另一个实例类通信,而该实例类并没有实例很难让我的头脑明白OOP(C#),c#,winforms,oop,xna,C#,Winforms,Oop,Xna,很长一段时间以来,我一直在使用Lua等非OOP语言(主要是脚本或web开发)。我现在在C#方面已经相当先进了,但就我目前的项目而言,我遇到了困难 我正在制作一种游戏,你可以用各种各样的东西制作一个2D环境 我正在使用一个在web上找到的将XNA移植到winform的示例,它工作得非常完美,没有延迟或任何问题 但那不是我的问题。我完全不知道如何使一个实例类与另一个实例类通信,而该实例类并没有实例 基本上,我已经制作了一个“插入”界面,带有一个按钮,可以插入一个地形图,然后在TreeView中显示。
基本上,我已经制作了一个“插入”界面,带有一个按钮,可以插入一个地形图,然后在TreeView中显示。我如何告诉表单“回复”用户已经选择了地形(我正在使用他们选择的枚举),并告诉表单向树视图添加节点?对象实例有几种通信方式。通常,它们会引发事件,而另一个实例可能已经在该事件上注册了事件处理程序
有时,它们会引发一个事件,而控制器实例将有一个已注册的处理程序,它将有对各种其他实例的引用,并找出要执行的操作。在没有看到您的代码的情况下,听起来您需要一个事件。虽然有点旧,但仍然是一个不错的版本,它将向您展示如何在应用程序中实现事件。声明、引发事件并使用它
实例的动词形式是“实例化”。如果我理解正确,您需要某种共享模型。模型可以通过两种方式处理:
在其他类型的应用程序中,我建议避免使用静态方法,并在需要时对已注册的单例或命名实例使用某种控制/依赖注入反转模式。但是对于一个简单的游戏编辑器,我认为这是最简单的方法 你可以做几件事 您需要建立一种在对象之间传递引用的机制。这里有一个小例子,我认为你的问题是什么,以及一个可能的解决办法 我要展示父母/孩子的关系
public class Book
{
public string BookText { get; set;}
}
public class Library
{
private Book myBook = new Book();
}
在这种情况下,图书馆可以参考/交谈/与书交流,因为它了解这本书。但是在这种情况下,您必须在创建库时创建图书。让我们更改此设置,以便可以向图书馆添加书籍
public class NewBook
{
public string BookText {get;set;}
public Library ParentLibrary {get;set;}
}
public class BetterLibrary
{
private List<NewBook> books = new List<NewBook>();
public bool AddNewBookToLibrary(NewBook bookToAdd)
{
books.Add(bookToAdd);
booktoAdd.ParentLibrary = this;
}
}
公共类新书
{
公共字符串BookText{get;set;}
公共库父库{get;set;}
}
公共图书馆
{
私有列表图书=新列表();
公共bool AddNewBookToLibrary(NewBook bookToAdd)
{
books.Add(bookToAdd);
booktoAdd.ParentLibrary=this;
}
}
现在,我们已经创建了一个可以向其中添加书籍的库,该库现在可以与任何已添加的书籍进行对话。它在图书馆的能力范围内,可以遍历图书集合并对每本书执行一些操作
此外,添加到库中的每个NewBook实例都知道哪个库实例是它的父库,并且可以访问父库中的公共功能
这是一种连接实例的简单方法。它可以应用于您创建的任何类。在TreeView中显示的任何对象中,book和library类都可以替换为控件和控件父对象或父对象/子对象关系
这能回答你的问题吗?如果您需要更多信息,请发表评论,我将进行更新。如果您显示一些代码,您将获得更好的答案,因为很难准确说出您的意思。我现在就编辑。基本上,我想与其他实例通信,但打开通信的实例实际上并没有实例所说的实例。等等,我能静态这些实例吗?或者这会更简单吗?@Ashley Davies我不会对这些实例进行静态分析。假设触发“dialog”实例的表单实例在“ItemAdded”事件上注册了一个处理程序。当用户单击insert完成“dialog”实例时,该按钮可以引发ItemAdded事件,并将该项作为参数。然后表单实例将获取事件并告诉树视图。这样,表单就充当了控制器。有很多方法可以剥下这只猫的皮。@Ashley Davies很可能有一个包含整个数据结构的模型实例。然后,“dialog”实例可以告诉模型如何更改,并且模型可以更改自身,从而引发“ModelChanged”事件。treeview可能是在该事件上注册事件处理程序的许多对象之一,所有这些对象都会适当地更新自己。有时我将父对象放入构造函数:new Book(Library),以便该书在构建时知道其父对象-这取决于所有用例。有时对象可以在多个集合中-此时需要一个不同的模型。@Cade-我完全同意你的观点。这实际上只是对OO新手的概念介绍。如前所述,如果需要更多信息,我会扩展答案,以包括更多的方法,如果其他答案还没有涵盖这些方法。