.net 对象从其容器中移除自身

.net 对象从其容器中移除自身,.net,oop,.net,Oop,什么是好的OOP方式 现在,我有了每个对象,其中包含对其容器的引用以及其键或索引的副本,以在该容器中标识自己。DeleteMe()方法调用容器的Delete(key)方法。我认为这是不好的,因为紧耦合、循环引用和键/索引的副本 我之所以要这样做,是因为每个对象都在UI中表示,并且有一个自己生成的上下文菜单,其中包含“删除”和“重命名”等选项 我听说这里可以使用委托或事件,但我不太明白委托或事件背后的动机,如果它们对我来说只是YAGNI。理想情况下,删除、重命名操作不应该属于对象,它们应该只属于容

什么是好的OOP方式

现在,我有了每个对象,其中包含对其容器的引用以及其键或索引的副本,以在该容器中标识自己。DeleteMe()方法调用容器的Delete(key)方法。我认为这是不好的,因为紧耦合、循环引用和键/索引的副本

我之所以要这样做,是因为每个对象都在UI中表示,并且有一个自己生成的上下文菜单,其中包含“删除”和“重命名”等选项


我听说这里可以使用委托或事件,但我不太明白委托或事件背后的动机,如果它们对我来说只是YAGNI。

理想情况下,删除、重命名操作不应该属于对象,它们应该只属于容器

我之所以要这样做,是因为每个对象都在UI中表示,并且有一个自己生成的上下文菜单,其中包含“删除”和“重命名”等选项

容器上的静态操作应该像

  container.Delete(Object)
  container.Rename(Object, String newName)
通过在对象本身上创建DeleteMe、Rename,您正在创建依赖于容器的对象,然后它不能被用于存储在其他容器中,如列表、字典等(否则DeleteMe将失败)

现在,对于Delete处理程序应该从容器中删除对象的要求,您可以使用。比如说

DeleteCommand command = new DeleteCommand(); // Create new Command 
CommandManager.Register(command); // Create CommandManager class that will have mechanism of registering command, and has reference to object container. method is something like command.Set(Object container)
command.Execute(this); // pass instance as parameter, and in the Execute it will be similar to container.Remove(parameter);

以上代码只是大纲,您可以根据需要定制。可以添加类似的其他操作(如重命名)。

一个好方法?不确定。但这听起来像是滥用的机会。删除/重命名等的+1不属于对象,而是属于使用这些对象的某种系统或容器。正如文件系统负责管理文件一样,文件不会“自行删除”。您能否澄清一下您的命令模式示例?最后一行在要删除的对象的上下文菜单处理程序中?它从哪里得到它的命令对象?另外,根据引用删除似乎需要O(N)搜索。我更喜欢使用索引键或字典键。可以在单击/双击事件中创建命令对象(在WinForms中,在WPF中,commmand基础结构已经构建)。你需要看一下/学习一下。但是它们会使设计松散耦合,并且在长期的删除中得到回报->您可以在容器中定义Delete(Key),然后可以在Delete方法中调用container.Delete(obj.Key)。您能确认我的理解吗?创建/刷新UI控件时,将创建DeleteCommand的实例。DeleteCommand对象包含指向容器的指针、键的副本和调用container.Remove(键)的Execute()方法。DeleteCommand对象存储在可能被删除的对象中,并保持在该对象中,直到刷新其关联的控件(在任何更改时发生)。Delete的click处理程序是被删除对象的成员函数,它调用.Execute()@提拉克