[英]how do i call both constructor initializers, base() and this()?
這很容易解決,但我只是好奇我是否可以使用語言功能,或者語言不允許它的事實意味着我在 class 設計中犯了一個邏輯錯誤。
我正在對我的代碼進行自我審查,以幫助“強化”它以供重復使用,而我剛剛遇到:
public partial class TrackTyped : Component
{
IContainer components = null;
public TrackTyped()
: base()
{
InitializeComponent();
}
public TrackTyped(IContainer container)
: base()
{
container.Add(this);
InitializeComponent();
}
}
當我在兩個構造函數中看到同一行代碼時,我通常會用“this()”調用另一個,但我似乎做不到。
如果我正確閱讀了規范(我剛開始嘗試閱讀規范,所以我可能不對):
10.11 Instance Constructors
constructor-declarator:
identifier ( formal-parameter-listopt ) constructor-initializeropt
constructor-initializer:
: base ( argument-listopt )
: this ( argument-listopt )
它是說我只能擁有其中一個。
問題:10.11 是否暗示沒有理由需要同時調用兩者,或者只是暗示該語言只支持調用一個?
無需同時調用兩者,因為this
會重定向到另一個將調用base
的構造函數。
這似乎是你想要的:
public partial class TrackTyped : Component
{
IContainer components = null;
public TrackTyped()
: base()
{
InitializeComponent();
}
public TrackTyped(IContainer container)
: this()
{
container.Add(this);
}
}
不過,現在第二個構造函數中語句的順序不同了。 如果這很重要,那么就沒有真正的好方法來做你想做的事,因為即使你有相同的line ,功能也有細微的不同。 在這種情況下,您只需要重復單行即可。 不要出汗。
而且您正在正確閱讀規范:它必須是其中之一。
你沒有,你也不能。 您可以通過:this(...)
將構造函數調用轉發給相同 class 的另一個構造函數。 該鏈中的最后一個構造函數必須通過:base(...)
隱式或顯式初始化基礎
假設 class A 有兩個構造函數。 一個用:base(2)
初始化基礎,另一個用:base(3)
初始化。 如果允許第一個構造函數也指定:this (/*call the other ctor*/)
base 應該如何初始化:使用 2 還是 3? 這就是為什么這些事情是不允許的
通常在 class 中完成,具有多個要通過構造函數初始化的屬性,其中一些是可選的。 我們有一個最大的構造函數,它接收所有調用基本構造函數的參數。 所有其他構造函數通過將 null/默認值傳遞給這個大構造函數來重定向到這個構造函數。 這樣,所有初始化代碼都保留在一個地方,可供其他人重用。
public MissingEntityException(Type type, string criteria, string message = "")
: this(type, criteria, message, null)
{
}
public MissingEntityException(Type type, string criteria, string message, Exception innerException)
: base(message, innerException)
{
this.EntityType = type;
this.Criteria = criteria;
}
這在層次結構中得到支持,並且可以涉及任何數量或參數。
這是你想要的?
public partial class TrackTyped : Component
{
IContainer components = null;
public TrackTyped() : base()
{
// logic for InitializeComponent() here
}
public TrackTyped(IContainer container) : this()
{
container.Add(this)
}
}
順便說一句:對於第二個 ctor,這是一個有趣的用法:
var a = TrackTyped(container);
我想知道刪除第二個 ctor 並這樣做對您來說是否會更清楚? (相同的最終結果)
container.Add(new TrackTyped());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.