0

我有一个父类 Command,它有一个 const 名称和一个名为 execute 的虚拟方法;两者都被儿童覆盖。我有一个方法,它接受一个命令列表并返回一个可能修改过的命令列表。

要确定是否应该更改输入命令列表,我需要在更改此列表之前知道列表中每个命令的类型。但问题是我必须使用 new 关键字才能为派生类创建一个与父类同名的静态成员,但我希望能够静态引用命令的名称。

我正在尝试做的示例:

public List<Command> ReplacementEffect(List<Command> exChain)
{
    for(int index = 0; index < exChain.Count; index++)
    {
         if(exChain[index].Name == StaticReference.Name)
         {
             //Modify exChain here
         }
    }
    return exChain;
}

使用 exChain[index].GetType() 的问题是我必须实例化另一个该类型的对象,以检查哪个是浪费、耗时且不直观。另外,我必须从 Name 中删除 const 修饰符。

编辑:

class Command
{
    public const string Name = "Null";

    public virtual void Execute()
    {
        //Basic implementation
    }
}

class StaticReference : Command
{
    public new const string Name = "StaticRef";

    public override void Execute()
    {
        //New implementation
    }
}
4

1 回答 1

0

如果您真的不能使用类型比较exChain[index].GetType() == typeof(StaticReference),因为派生类都属于类型StaticReference,但您想通过Name(未在示例中显示 - 但如果不是这种情况,请改用类型比较)进行区分,您可以使用静态名称的属性,但通过虚拟访问器访问它:

class Command
{
    public const string Name = "Null";

    public virtual string CommandName
    {
        get
        {
            return Name;
        }
    }
}

class StaticReference : Command
{
    public new const string Name = "StaticRef";

    public virtual string CommandName
    {
        get
        {
            return Name;
        }
    }
}

用法:

     if(exChain[index].CommandName == StaticReference.Name)
     {
         //Modify exChain here
     }
于 2013-03-30T01:44:20.040 回答