C# 什么';我的课怎么了?
提交这两个类(以及业务逻辑和数据访问逻辑)进行代码审查。审稿人看着代码笑了,建议我重新上课。他叫我做些调查,不给我任何线索。我没有发现任何错误。“submenu”是基类而不是菜单,这看起来有点尴尬。但我的要求是这样的。菜单只有两个级别(子菜单永远不存在)。他们有什么好笑的?如果有人告诉我改进这些课程的方法,我将不胜感激C# 什么';我的课怎么了?,c#,oop,inheritance,C#,Oop,Inheritance,提交这两个类(以及业务逻辑和数据访问逻辑)进行代码审查。审稿人看着代码笑了,建议我重新上课。他叫我做些调查,不给我任何线索。我没有发现任何错误。“submenu”是基类而不是菜单,这看起来有点尴尬。但我的要求是这样的。菜单只有两个级别(子菜单永远不存在)。他们有什么好笑的?如果有人告诉我改进这些课程的方法,我将不胜感激 [Serializable] public class Menu: SubMenu { private List<SubMenu> _subMenu;
[Serializable]
public class Menu: SubMenu
{
private List<SubMenu> _subMenu;
public List<SubMenu> SubMenu
{
get
{
if (_subMenu == null)
_subMenu = new List<SubMenu>();
return _subMenu;
}
set
{
_subMenu = value;
}
}
}
[Serializable]
public class SubMenu
{
public int ID { get; set; }
public string MenuText { get; set; }
public string MenuURL { get; set; }
public string ImageURL { get; set; }
}
[可序列化]
公共类菜单:子菜单
{
私有列表_子菜单;
公共列表子菜单
{
得到
{
如果(_子菜单==null)
_子菜单=新建列表();
返回_子菜单;
}
设置
{
_子菜单=值;
}
}
}
[可序列化]
公共类子菜单
{
公共int ID{get;set;}
公共字符串MenuText{get;set;}
公共字符串MenuURL{get;set;}
公共字符串ImageURL{get;set;}
}
我不确定下面的语句是否正确(如果我错了,请纠正我),但是如果一个类从基类继承,派生类是否应该保留其基类的项列表?在什么情况下这会有用(我现在想不出有什么有用的)。例如,如果我想到“马”和“动物”:马类应该有动物列表吗?听起来有点奇怪。我同意上述评论员的观点。对于你的评论者来说,仅仅是大笑而没有提供建设性的建议是粗鲁的,而且会适得其反。我的答案是,“先回去从评审员那里获得专业的建设性建议”。如果这还没有实现,那么我担心审查者似乎是由自我驱动的,而不是指导和教育的管理和原则。考虑到您的要求,我发现唯一错误的是命名问题:
public List<SubMenu> SubMenu
公共列表子菜单
这是一个集合,应该是复数。但说真的,这没什么好笑的
现在,如果您回到您的*******e审阅者那里,准备好您的论点:
- 继承加上一个集合是必要的,因为菜单本身就是一个子菜单,因为菜单有一个Text/Url/Image/ID,并且它有一个位于其下方的子菜单集合
- 解释SubMenu是Menu的基类时的需求(实际上并不那么严格)
我最好的猜测是,这一切看起来都有点愚蠢,他只看了一眼而已。似乎你有一个菜单,可以包含两种类型的项目 1) “简单菜单项”(Id、文本、url、图像)
2) 另一个菜单(子菜单)
我知道你只想深入一个层次,但实际上重复使用一个通用的解决方案可能更简单 复合设计模式()似乎非常适合 hth,
艾伦 提交这两个类(以及业务逻辑和数据访问逻辑)进行代码审查。审稿人看着代码笑了,建议我重新上课。他叫我做些调查,不给我任何线索 糟糕的评论,让您查找它真的没有意义,特别是如果您真的没有看到自己代码中的任何错误 我没有发现任何错误。“submenu”是基类而不是菜单,这看起来有点尴尬。但我的要求是这样的。。。菜单只有两个级别(子菜单永远不存在) 我觉得您的实现并不好笑,但天真的是,有“从不”这样的东西,这有点好笑。如果每次有人说某件事永远不会发生,而它最终真的发生了,我都有一分钱,那么我现在至少会多出15便士 如果您的需求是菜单只有两个级别,那么不要构建代码来扩展该需求。然而,如果您可以选择非常容易地将代码开放给将来的扩展,那么为什么不这样做呢?没有成本,只有效益。在你的情况下,我认为“向未来扩展开放”确实很简单 他们有什么好笑的?如果有人告诉我改进这些课程的方法,我将不胜感激 这不一定有趣,也不一定是错的。不过我会换一种方式:如果菜单可以包含菜单,那不是构图吗?如果是,菜单和子菜单之间有什么区别?子菜单是一个恰好有父菜单的菜单,但它应该在意吗?它应该知道吗?它真的有什么不同于菜单本身的行为吗
class Menu
+addSubmenu( Menu menu ) : Menu
+addItem( Item item ) : Menu
这可能就是我的尝试的样子。这里最大的问题是,无论是谁做了你的评估,你都应该要求他们更具建设性和帮助性,如果他们仍然坚持如此粗鲁,我会把它交给经理
也就是说,我猜他们在你的设计中看到的是你正在使用继承。你需要遗产吗?如果有一个包含子菜单列表且没有父子关系的菜单类,或者可能只有一个可以包含自身列表的MenuItem对象,您可能会得到更好的服务 实际上,我更喜欢第二种方法,比如:
[Serializable]
public class MenuItem
{
public MenuItem()
{
MenuItems = new List<MenuItem>();
}
public int ID { get; set; }
public string MenuText { get; set; }
public string MenuURL { get; set; }
public string ImageURL { get; set; }
// I'm not bothering with the code to protect access to the list
// in this example but you might want that too...
public List<MenuItem> MenuItems { get; set; }
}
[可序列化]
公共类菜单项
{
公共菜单项()
{
MenuItems=新列表();
}
公共int ID{get;set;}
公共字符串MenuText{get;set;}
公共字符串MenuURL{get;set;}
公共字符串ImageURL{get;set;}
//我不想费心用代码来保护对列表的访问
//在本例中,但您可能也希望。。。
公共列表菜单项{get;set;}
}
对象的总体构造是好的,比如惰性实例化,尽管正如其他答案所表明的,我认为您的继承有点遗漏;但这不是问题!
[Serializable]
public class MenuItem
{
public int Id { get; set; }
public string MenuText { get; set; }
public string MenuUrl { get; set; }
public string ImageUrl { get; set; }
public List<MenuItem> Children { get; set; }
public MenuItem(int id, string text, string url)
: this(id, text, url, String.Empty)
{
}
public MenuItem(int id, string text, string url, string imageUrl)
{
this.Id = id;
this.MenuText = text;
this.MenuUrl = url;
this.ImageUrl = imageUrl;
this.Children = new List<MenuItem>();
}
}