2010-02-10 29 views
1
public abstract class ExeCommand 
{ 
    private static object commandHandler; 
    public static object CommandHandler 
    { 
     get { return commandHandler; } 
     set { commandHandler = value; } 
    } 
} 

class ServerCommand : ExeCommand 
{ 
} 

这是它的光秃秃的骨头。 我想允许如何防止对派生类中的静态属性进行设置访问?

ExeCommand.CommandHandler = myCommandHandler

但不

ServerCommand.CommandHandler = myCommandHandler

任何方式强制执行呢?

回答

2

目前尚不清楚你在这里试图达到什么目的。

Cory指出,您可以通过声明相同的属性但隐藏setter来防止ServerCommand.CommandHandler可写,但为什么?来电者总是可以使用ExeCommand.CommandHandler来分配一个值。 ServerCommand从其基类共享静态成员。

也许如果你能解释你正在尝试实现更好的设计可能会被提出。

+0

它是我正在实施的命令模式的一部分。 ExeCommand具有CommandText,参数和在派生类中重写的Execute()方法。例如。 ServerCommand将使用反射来调用使用CommandText作为方法名称的方法。 CommandHandler是包含在另一个命名空间中保存的这些方法的类。 UserCommand是以类似方式使用的另一个ExeCommand。这似乎是错误的,UserCommand.CommandHandler = myCommandHandler也会影响ServerCommand的命令处理程序。通过ExeCommand强制更改属性似乎是正确的。 –

+1

也许这些不应该是静态属性呢? – LBushkin

2

使用new

class ServerCommand : ExeCommand 
{ 
    public new static object CommandHandler 
    { 
     get { return ExeCommand.CommandHandler; } 
    } 
} 

这并不能完全解决问题,因为你仍然可以转换为ExeCommand这将允许修改。

更新:如其他人指出base在静态方法中无效。纠正。

+1

“基”在静态方法中不合法。只需明确指定类型即可。 –

+0

不应该是私人/保护? –

+0

@Eric:好的电话。 –

3

两者都是一样的东西。他们编译成相同的代码。

你试图做的是毫无意义的。

对不起,我很生气。

+0

如果从基地派生的唯一一点是限制访问,那么是的。我认为这是一个简化的例子,派生类中正在进行更多的操作。 –

相关问题