Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
很难让我的头脑明白OOP(C#)_C#_Winforms_Oop_Xna - Fatal编程技术网

很难让我的头脑明白OOP(C#)

很难让我的头脑明白OOP(C#),c#,winforms,oop,xna,C#,Winforms,Oop,Xna,很长一段时间以来,我一直在使用Lua等非OOP语言(主要是脚本或web开发)。我现在在C#方面已经相当先进了,但就我目前的项目而言,我遇到了困难 我正在制作一种游戏,你可以用各种各样的东西制作一个2D环境 我正在使用一个在web上找到的将XNA移植到winform的示例,它工作得非常完美,没有延迟或任何问题 但那不是我的问题。我完全不知道如何使一个实例类与另一个实例类通信,而该实例类并没有实例 基本上,我已经制作了一个“插入”界面,带有一个按钮,可以插入一个地形图,然后在TreeView中显示。

很长一段时间以来,我一直在使用Lua等非OOP语言(主要是脚本或web开发)。我现在在C#方面已经相当先进了,但就我目前的项目而言,我遇到了困难

我正在制作一种游戏,你可以用各种各样的东西制作一个2D环境

我正在使用一个在web上找到的将XNA移植到winform的示例,它工作得非常完美,没有延迟或任何问题

但那不是我的问题。我完全不知道如何使一个实例类与另一个实例类通信,而该实例类并没有实例


基本上,我已经制作了一个“插入”界面,带有一个按钮,可以插入一个地形图,然后在TreeView中显示。我如何告诉表单“回复”用户已经选择了地形(我正在使用他们选择的枚举),并告诉表单向树视图添加节点?

对象实例有几种通信方式。通常,它们会引发事件,而另一个实例可能已经在该事件上注册了事件处理程序


有时,它们会引发一个事件,而控制器实例将有一个已注册的处理程序,它将有对各种其他实例的引用,并找出要执行的操作。

在没有看到您的代码的情况下,听起来您需要一个事件。虽然有点旧,但仍然是一个不错的版本,它将向您展示如何在应用程序中实现事件。

声明、引发事件并使用它


实例的动词形式是“实例化”。

如果我理解正确,您需要某种共享模型。模型可以通过两种方式处理:

  • 使用XNA生成某些图形的步骤
  • 填充树视图以便编辑它的步骤
  • 我知道只有一个模型可以定义2D世界。因此,可以使用静态方法来获取当前加载到应用程序中的模型(例如WorldEnvironment.Current)。 您的游戏引擎必须绘制在WorldEnvironment.Current中找到的内容。另一方面,使用Winforms编辑此WorldEnvironment.Current实例。任何更改都将对其他“视图”(XNA视图或WinForms)可见。不久前,我在一个窗口上使用XNA,在另一个窗口上使用WPF做了类似的事情


    在其他类型的应用程序中,我建议避免使用静态方法,并在需要时对已注册的单例或命名实例使用某种控制/依赖注入反转模式。但是对于一个简单的游戏编辑器,我认为这是最简单的方法

    你可以做几件事

    您需要建立一种在对象之间传递引用的机制。这里有一个小例子,我认为你的问题是什么,以及一个可能的解决办法

    我要展示父母/孩子的关系

    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新手的概念介绍。如前所述,如果需要更多信息,我会扩展答案,以包括更多的方法,如果其他答案还没有涵盖这些方法。