1

我有一个小难题,也许你可以帮我解决。

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

我需要做的是添加功能的概念,其中用户将属于一个(或多个角色),并且该角色将具有与之关联的一个或多个功能,允许我们根据用户是否属于授权特定操作分配给已分配功能的角色。

话虽如此,我的问题与它无关,这是一个通用的类设计问题。

我想在我的基本 RoleProvider 类中提供一个抽象方法来创建函数(并将其持久化),但我想让它成为可选的以保存该函数的描述,所以我需要创建一个重载的 CreateFunction 方法签名接受名称,另一个接受名称和描述。

我可以想到以下场景:

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

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

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

我认为最好的选择是第三个...

一般如何处理这种情况?当您设计一个抽象类并且它包含重载方法时。我认为这并不少见……

4

2 回答 2

1

我觉得 DRYness 和强制契约的最佳组合如下(伪代码):

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 中有一条规则支持这一决定:“永远不要从构造函数中调用非最终方法。”

于 2008-08-29T17:41:16.940 回答
0

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

查看

要回答您问题的第二部分,我不会使用 Abstract 类。相反,只需在构造函数中提供功能并完成即可。它看起来你想要指定的行为,并且你不希望它改变。为什么要强制后代提供实现。

于 2008-08-29T18:42:31.490 回答