2008-08-29 72 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

爲了回答你問題的第二部分,我不會用一個抽象類。相反,只需在構造函數中提供這些功能並完成它即可。它出現在你想要指定的行爲,你不希望它改變。爲什麼迫使後代提供實施。