基於顯式實現接口的技巧可用於防止基礎算法實現所需的方法的意外調用。然而,這是一個可以被破壞的安全措施,但是開發人員知道他會做什麼的可能性很高。
的接口聲明由AlgorithmMethod
所需的方法:
使用此接口,傳遞到它的構造函數,調用所需的方法
public interface IAlgorithmMethodImpl
{
bool OnSimulationStart();
bool DoSomeStep();
void OnSimulationEnd(bool result);
}
抽象基類:
public abstract class AlgorithmBase
{
protected AlgorithmBase(IAlgorithmMethodImpl impl)
{
Impl = impl;
}
// can be a property reasonable cases; however, a field
// fits well into our scenario
private IAlgorithmMethodImpl Impl;
protected void AlgorithmMethod()
{
if(!Impl.OnSimulationStart())
{
Impl.OnSimulationEnd(false);
return;
}
if(!DoSomeStep())
{
Impl.OnSimulationEnd(false);
return;
}
Impl.OnSimulationEnd(true);
}
// no abstract method declarations here — they are provided by 'Impl'
}
那麼具體的算法類從AlgorithmBase
繼承使用顯式接口實現來封裝必要方法的實現(如使用基類中聲明的抽象方法),同時阻止它們被調用acci牙齒:
public class MySuperAlgorithm : AlgorithmBase, IAlgorithmMethodImpl
{
public MySuperAlgorithm()
// pass a reference to this instance as the class
// that implements the required methods
: base(this)
{
}
// explicit implementation of IAlgorithmMethodImpl
bool IAlgorithmMethodImpl.OnSimulationStart() { ... implementation ... }
bool IAlgorithmMethodImpl.DoSomeStep() { ... implementation ... }
void IAlgorithmMethodImpl.OnSimulationEnd(bool result) { ... implementation ... }
}
這個計算策略的優勢 - 除了防止的實現方法調用意外 - 是,你可以選擇是否封裝實施後代,或將其分解成一個單獨的類。
你會問這種模式? –
你的意思是,我的具體情況是什麼? – Kuba
你能發佈一個你試圖防止的情況的非平凡的例子嗎?當你不得不擔心不恰當地使用這些抽象方法時,很可能你沒有適當地分解你的問題。 –