如何处理因实现类而异的静态字段

Ewa*_*ace 5 c# java

我一直都遇到这个问题。假设我正在创建命令行界面(Java或C#,问题与我想的相同,我将在此处显示C#)。

  1. 我定义一个接口ICommand
  2. 我创建了一个抽象基类CommandBase,它实现了ICommand,以包含通用代码。
  3. 我创建了几个实现类,每个实现类都扩展了基类(并通过扩展了接口)。

现在-假设接口指定所有命令都实现Name属性和Execute方法...

对于Name,我的每个实例类都必须返回一个字符串,该字符串是该命令的名称。该字符串(“ HELP”,“ PRINT”等)对于相关类是静态的。我希望能够做的是定义:

公共抽象静态常量字符串名称;

但是(很遗憾)您不能在接口中定义静态成员。

我多年来一直在为这个问题而苦苦挣扎(几乎在我拥有类似课程的家庭中任何地方),因此下面将发表我自己的3种可能的解决方案,供您投票。但是,由于它们都不是理想的,我希望有人能发布一个更优雅的解决方案。


更新:

  1. 我无法使代码格式正常工作(Safari / Mac?)。道歉。
  2. 我使用的示例很简单。在现实生活中,有时会有数十个实现类和这种半静态类型的多个字段(即实现类为静态)。

  3. 我忘了提-理想情况下,我希望能够静态查询此信息:

    字符串名称= CommandHelp.Name;

在我提出的3个解决方案中,有2个要求实例化该类,然后才能发现此静态信息,这很丑陋。

Ewa*_*ace 0

[建议的解决方案#1(共 3 个)]

  1. 在接口中定义一个抽象属性Name,以强制所有实现类都实现name属性。
  2. (在 C# 中)将此属性添加为基类中的抽象。
  3. 在实现中是这样实现的:

    public string Name 
    {
      get {return COMMAND_NAME;}
    }
    
    Run Code Online (Sandbox Code Playgroud)

    其中 name 是该类中定义的常量。

    优点:

    • 名称本身定义为常量。
    • 接口要求创建属性。

    缺点:

    • 重复(我讨厌)。完全相同的属性访问器代码粘贴到我的每一个实现中。为什么不能将其放在基类中以避免混乱?