Object将自己从容器中删除

时间:2012-05-16 02:20:18

标签: .net oop

什么是好的OOP方式?

现在我让每个对象都包含对其容器的引用,以及它的键或索引的副本,以在该容器中标识自己。 DeleteMe()方法调用容器的Delete(key)方法。我认为这很糟糕,因为紧密耦合,循环引用和键/索引的重复副本。

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

我听说代表或事件可以在这里使用,但我并不真正了解他们背后的动机以及他们是否只是YAGNI。

1 个答案:

答案 0 :(得分:2)

理想情况下,删除,重命名操作不应属于对象,这些操作应仅属于容器。

  
    

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

  

应该像

一样调用容器上的静态操作
  container.Delete(Object)
  container.Rename(Object, String newName)

通过创建DeleteMe,重命名对象本身,您创建依赖于容器的对象,然后它不能用于存储在List,Dictionary等其他容器中(或者DeleteMe将失败)

现在要求Delete Handler从容器中删除对象,您可以使用command pattern。例如

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

以上代码只是概述,您可以根据要求进行自定义。其他操作(如重命名)可以类似地添加。