2008-08-29 71 views
1

我有一点困惑,也许你可以帮我理清。班级设计决定

我一直在努力修改ASP.NET的成员来添加一个间接级别。基本上,ASP.NET的成员资格支持用户和角色,所有授权规则都基于用户是否属于某个角色。

我需要做的是添加Function的概念,其中用户将属于一个或多个角色,角色将拥有一个或多个与它们相关的功能,从而允许我们根据如果用户属于具有分配功能的角色。

话虽如此,我的问题与它无关,它是一个通用的类设计问题。我想在我的基础RoleProvider类中提供一个抽象方法来创建函数(并坚持它),但我想使它成为可选项来保存该函数的描述,所以我需要创建我的CreateFunction方法一个重载,一个签名接受名字,另一个接受名字和描述。

我能想到的以下情况:

  1. 与抽象修饰符创建两个签名。这有一个问题,即实现者可能不尊重最佳实践,即一个重载应该调用另一个参数正规化,并且逻辑应该只在最后一个(具有所有参数的那个)中。此外,要求开发人员实施这两种方法并不好。

  2. 创建第一个像虚拟,第二个像抽象。从第一个调用第二个,允许实施者覆盖该行为。它也有同样的问题,执行者在覆盖它时会做出“糟糕的决定”。

  3. 和以前一样,但不允许第一个被覆盖(删除虚拟修改器)。这里的问题是实现者必须意识到可以用空描述调用该方法并且必须处理该情况。

我认为最好的办法是第三个......

如何这种情况下,一般处理?当你设计一个抽象类时,它包含重载的方法。这并不是说鲜见我想......

回答

1

我觉得干涩的最佳组合,并迫使合同如下(在伪代码):

class Base { 
    public final constructor(name) { 
    constructor(name, null) 
    end 

    public abstract constructor(name, description); 
} 

,或者:

class Base { 
    public abstract constructor(name); 

    public final constructor(name, description) { 
    constructor(name) 
    this.set_description(description) 
    } 

    private final set_description(description) { 
    ... 
    } 
} 

在Java中有一条规则支持这个决定:“从构造函数中调用非final方法。”

0

要回答您的文章的第一部分,请查看AzMan(授权管理器),顺便说一下,它是内置于Windows中的。它能够指定可以重组为角色或直接分配给用户的操作。

Check out

为了回答你问题的第二部分,我不会用一个抽象类。相反,只需在构造函数中提供这些功能并完成它即可。它出现在你想要指定的行为,你不希望它改变。为什么迫使后代提供实施。