我很难理解OOP (c#)

本文关键字:OOP 难理解 | 更新日期: 2023-09-27 17:49:23

我一直在使用非面向对象语言(主要是脚本或web开发),如Lua很长一段时间。我现在在c#方面已经相当先进了,但就我目前的项目而言,我遇到了瓶颈。

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

我正在使用一个我在网上找到的将XNA移植到winform的例子,它工作得很好,没有延迟或任何东西。

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

基本上,我已经做了一个"插入"界面,用一个按钮插入一块地形,然后在Treeview1中出现。我如何告诉表单"回复"用户已经选择了地形(我使用枚举来表示他们选择了什么),并告诉表单添加一个节点到treeview?

我很难理解OOP (c#)

你可以做几件事。

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

我要演示亲子关系。

public class Book
{
    public string BookText { get; set;}
}
public class Library
{
    private Book myBook = new Book();
}

在这种情况下,图书馆可以参考/交谈/与书交流,因为它有一本书的意识。但在这种情况下,你必须在创建图书馆的同时创建图书。让我们改变这一点,以便我们可以向Library添加图书。

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;
    }
}

现在,我们已经创建了一个可以向其中添加图书的库,并且该库现在可以与已添加的任何图书进行通信。图书馆有能力遍历图书集合并对每本书执行一些操作。

同时,每个被添加到Library的NewBook实例都知道哪个Library实例是它的父库,并且可以访问父库上的公共功能。

这是一种连接实例的简单方法。它可以应用于您创建的任何类。book和library类可以被控件和控件父类或父/子关系所取代。

这回答了你的问题吗?请留下评论,如果你需要更多,我会更新的。

对象实例可以通过几种方式进行通信。通常它们会引发事件,而其他实例可能已经在该事件上注册了事件处理程序。

有时它们会引发一个事件,控制器实例将有一个注册的处理程序,它将引用各种其他实例,并找出该做什么

声明、引发事件并使用它

instance的动词形式是"instantiate"

没有看到您的代码,听起来您需要一个事件。本教程有点老了,但仍然是一个很好的教程,它将向您展示如何在应用程序中实现事件。

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

  1. 使用XNA生成一些图纸
  2. 填充树形视图,以便对其进行编辑

我知道有一个单一的模型来定义你的2D世界。因此,有一个静态方法来获取当前在应用程序中加载的模型(例如WorldEnvironment.Current)是可以的。你的游戏引擎必须绘制它在WorldEnvironment.Current中找到的内容。另一方面,使用Winforms来编辑这个WorldEnvironment。当前实例。任何更改对其他"视图"(XNA视图或WinForms)都是可见的。我以前也做过类似的事情,在一个窗口使用XNA,在另一个窗口使用WPF。

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