什么是好的OOP方式?
现在我让每个对象都包含对其容器的引用,以及它的键或索引的副本,以在该容器中标识自己。 DeleteMe()方法调用容器的Delete(key)方法。我认为这很糟糕,因为紧密耦合,循环引用和键/索引的重复副本。
我想这样做的原因是因为每个对象都在UI中表示,并且具有自己生成的上下文菜单,其中包含“删除”和“重命名”等选项。
我听说代表或事件可以在这里使用,但我并不真正了解他们背后的动机以及他们是否只是YAGNI。
答案 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);
以上代码只是概述,您可以根据要求进行自定义。其他操作(如重命名)可以类似地添加。