有沒有辦法在C#中做到這一點?我知道子類將在調用它自己的構造函數之前調用超類的構造函數,但是如果我在超類上有一些代碼,只有在所有的子類構造函數被調用後纔會執行它。在構建完所有子類之後,如何在超類中執行一些代碼?
回答
的一種方式。所以,你構建的實例,然後調用它調用基類初始化以適當的順序
class MyBase
{
// Only if need to do some core initialization
public MyBase()
{
}
public virtual Initialize()
{
// do some initialization stuff here
}
}
class MyDerived : MyBase
{
// Only if need to do some core initialization
public MyDerived()
{
}
public override Initialize()
{
// do some initialization stuff here
// Call the base class initialization function
base.Initialize();
}
}
如果你去兩次通過創建/初始化,我會建議使用工廠方法或Asbtract Factory來確保初始化語義不會遍佈整個代碼 – LBushkin 2010-04-30 20:03:17
好的,這不完全是我的意思,但它有點幫助我解決問題,ty。 – 2010-04-30 20:10:44
class A : B
{
public A() : base()
{
base.doSomething();
}
}
class B : C
{
public B() : base()
{
}
public void doSomething() { /* ... */ }
}
class C
{
public C() { /* ... */ }
}
執行順序應爲:
- Ç::構造函數()
- B ::構造函數()
- A ::構造函數()
- B :: doSomething的( )
正如我所說的,該方法應該在超類中執行,而不是在子類中執行,只是在子類中調用超類方法。 – 2010-04-30 19:56:29
我懷疑OP正在尋找一個解決方案,其中的基類可以確保類型完全實例化後運行一些初始化。否則,每個派生類作者都必須確保調用必要的初始化邏輯。 – LBushkin 2010-04-30 20:02:23
這正是我需要的:( – 2010-04-30 20:08:11
我不確定你是什麼意思 - 你不能只是在我們最後一個子類的結尾調用超類的代碼structor?或者,您可以在實例化後直接調用它。
class Program
{
static void Main(string[] args)
{
SubSub obj = new SubSub();
//obj.DoStuff();
Console.ReadLine();
}
}
class Super
{
public Super()
{
Console.WriteLine("Constructing Super");
}
public void DoStuff()
{
Console.WriteLine("Doin' stuff");
}
}
class Sub : Super
{
public Sub()
{
Console.WriteLine("Constructing Sub");
}
}
class SubSub : Sub
{
public SubSub()
{
Console.WriteLine("Constructing SubSub");
DoStuff();
}
}
這將輸出:實現,這將是去一個兩階段的構造和初始化
Constructing Super
Constructing Sub
Constructing SubSub
Doin' stuff
我的意思是代碼可以在超類中的對象的完整構造後執行,子類不應該知道它 – 2010-04-30 19:54:31
你可以做以下的初始化方法,但它是有風險的(見下面我的編輯):
public class Parent
{
public Parent()
{
Initialize();
}
protected virtual void Initialize()
{
// do stuff
}
}
public class Child : Parent
{
protected override void Initialize()
{
// do child stuff
base.Initialize();
}
}
編輯
正如下面泰倫斯的評論認爲,這是一個危險的做法,因爲在執行Child
的構造函數之前Initialize()
將被執行。如果在Child
的構造函數中有任何字段被初始化,如果它們被Initialize()
使用,則它們將不會準備好。這可能會導致令人困惑的錯誤。
一個簡單的解決方案是放棄父母撥打Initialize()
,而是讓子類別撥打Initialize()
。正如其他人所建議的,另一種選擇是使用抽象工廠模式。
下面是一個使用靜態工廠方法的簡單的解決方案:
class Program
{
static void Main()
{
Child.Create(() => new Child(5));
Console.ReadKey();
}
}
public abstract class Parent
{
protected virtual void Initialize()
{
Console.Write(" is the number.");
}
public static TChild Create<TChild>(Func<TChild> childGetter)
where TChild : Parent
{
var child = childGetter();
child.Initialize();
return child;
}
}
public class Child : Parent
{
private int _number;
public Child(int number)
{
_number = number;
}
protected override void Initialize()
{
Console.Write(_number.ToString());
base.Initialize();
}
}
沒有什麼內置到C#語言,可以讓你做到這一點。但是,使用創建模式可以支持它。例如,Abstract Factory模式可能會對您有所幫助。基礎工廠將確保在新創建的基類被實例化爲具體的子類型後調用方法。
你知道溫莎城堡是否有類似的東西? – 2010-04-30 20:11:30
這實際上更像是一個AOP工具的領域,例如PostSharp(現在提醒我應該已經包含在我的答案中),但是Windsor可能會這樣做。從未嘗試過。 – RationalGeek 2010-04-30 20:22:10
- 1. Javascript如何在forEach完成執行後運行一些代碼
- 2. 如何在segue完成後執行一些代碼?
- 3. 如何在UIView自定義繪圖代碼完成後執行一些代碼?
- 4. 如何在每次構建scons後運行一些代碼?
- 5. 執行代碼一次之後所有的意見都在Ember.js完全呈現
- 6. 如何執行所有這些類
- 7. 如何在所有線程完成後才執行一段代碼
- 8. 有沒有在JAVA中執行超類的構造函數之前的子類的構造函數?
- 9. 如何在子類中的方法之前和之後運行代碼?
- 10. 如何使用構造函數代碼在java中執行類?
- 11. 如何在一次使用javascript執行代碼行之後以空格刪除div中的所有子節點?
- 12. 如何在超類的構造函數中處理所有子類的成員?
- 13. Xcode 8.0在對代碼進行任何更改之後構建所有目標
- 14. 如何在特定線程完成其工作後執行一些代碼?
- 15. 在虛擬方法的所有覆蓋之後執行代碼
- 16. 僅在執行完所有代碼後纔會顯示JavaScript附加子(div)
- 17. C#如何在對象構造後執行代碼(後構造)
- 18. 在任何junit測試運行之前執行一些代碼
- 19. 在絕對執行的所有測試之前和之後運行代碼
- 20. 在某些代碼完成執行後延遲$ ajax調用
- 21. 如何在執行qmlRegisterType之後獲取有效的類實例?
- 22. 如何在Java中執行AsyncTask子類?
- 23. 如何在scrapy中完成所有爬網之後執行該功能?
- 24. 函數在功能完成之前執行後的代碼
- 25. 如何在所有派生類共享的根類中創建一些字典?
- 26. 函數在下一行代碼之前完成執行。
- 27. 確保只有在完全執行了所有PHP之後才執行jQuery
- 28. 在執行塊之前和之後執行一些指令
- 29. 如何在所有測試之前執行MSTest中的數據設置代碼的一行代碼
- 30. 如何在Angular JS中調用$ state.reload()之後執行代碼?
您有具體的使用示例嗎? – 2010-04-30 19:45:25