2010-02-10 34 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

如果從基地派生的唯一一點是限制訪問,那麼是的。我認爲這是一個簡化的例子,派生類中正在進行更多的操作。 –

相關問題