Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';我的课怎么了?_C#_Oop_Inheritance - Fatal编程技术网

C# 什么';我的课怎么了?

C# 什么';我的课怎么了?,c#,oop,inheritance,C#,Oop,Inheritance,提交这两个类(以及业务逻辑和数据访问逻辑)进行代码审查。审稿人看着代码笑了,建议我重新上课。他叫我做些调查,不给我任何线索。我没有发现任何错误。“submenu”是基类而不是菜单,这看起来有点尴尬。但我的要求是这样的。菜单只有两个级别(子菜单永远不存在)。他们有什么好笑的?如果有人告诉我改进这些课程的方法,我将不胜感激 [Serializable] public class Menu: SubMenu { private List<SubMenu> _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>();
    }
}