我試圖找到一個正確的方法來限制/強制使用方法,以確保正確的內部處理。C# - 強制重寫的方法被父級調用,而不是實例
給出下面的抽象基類
public abstract class BaseClass
{
// needs to be overriden by concrete implementation
protected abstract void CreateInternal(object dataToCreate);
// only visible method
public void Create(object dataToCreate)
{
// check the data provided <-- this is important to be done each time
CheckData(dataToCreate);
// call implementation of concrete class
CreateInternal(dataToCreate);
}
private void CheckData(object dataToCheck)
{
if(dataToCheck == null) throw new Exception("Data is not valid");
}
}
和一個簡單的實現
public class ChildClass : BaseClass
{
protected override void CreateInternal(object dataToCreate)
{
// do create-stuff related to ChildClass
}
}
我的問題:有沒有辦法來限制訪問CreateInternal
?在ChildClass
我可以創建一個公共方法
public void DoStuff(object dataToDoStuff)
{
// access protected method is not forbidden
CreateInternal(dataToDoStuff);
}
這將調用CreateInternal
沒有做必要的檢查,就好像如果通過基類的Create
稱它爲會做。 有什麼辦法可以在CreateInternal
之前強制使用Create
?編譯時不需要(但它會很好),但至少在運行時。
我有類似的檢查誰打電話的想法。
public class ChildClass : BaseClass
{
protected override void CreateInternal(object dataToCreate)
{
// if not called via base 'Create' -> throw exception
}
}
有沒有某種模式我不知道或者是我想要實現的太過分了,根本不可能?
您可以創建調用堆棧並檢查'Create'是否是最後一種方法(不包含當前方法),但這非常昂貴。問題是如果'Create'將會是虛擬的,並且有一個重寫的'Create'不會調用你的支票。不,我不認爲有強制調用方法的解決方案。唯一被保證的是ctor。首先調用Base Ctor。但是,嘿,這是保護。任何創建派生類並調用某些方法的人都應該知道他在做什麼。 –