[英]Pass Inherited Class Constructor Arguments to Base Constructor Arguments
將繼承的類構造函數的參數傳遞給基類構造函數的“ C#方法”是什么? 這會要求我重寫基類中的base_model字符串嗎?
// Base class
class vehicle
{
private string base_model = String.Empty;
vehicle(string model)
{
this.base_model = model;
}
}
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
tesla(string model) : base ( **pass model to base_model** )
{
// Initialize
}
}
class ferrari : vehicle
{
private readonly string model = "458 Spider"; // This is unchanging
ferrari(string model) : base ( **pass model to base_model** )
{
// Initialize
}
}
@JohnLBevan引起了我另一個注意:
這使我想到另一個問題:是否可能沒有tesla
類(或ferrari
類的構造函數)參數,並自動將model
變量(即"Model S"
)傳遞給base_model
?
實現此目標的一種更符合OO標准的方法是使用抽象屬性。 這意味着基類已經定義了屬性,但是擴展類必須實現它。 這也意味着您不能直接創建vehicle
的實例,而必須創建派生類型之一。
abstract class vehicle
{
vehicle() { }
public abstract string Model { get; }
}
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
public override string Model { get { return model; }}
}
class ferrari : vehicle
{
public override string Model { get { return "458 Spider"; }}
}
您真正想要將值從派生構造函數傳遞給基構造函數的唯一時間是在基類中積極使用這些值時。 通常,當您重寫基本構造函數或使用依賴項注入或依賴項解決方案模式時,通常會出現這種情況。 基類不應充當派生類中信息的集合。
正是您所做的,僅將變量名放在帶有星號的位置:
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
tesla(string model) : base ( model )
{
// Initialize
}
}
您還需要確保基類的構造函數對其子類可見(即不是私有的)
// Base class
class vehicle
{
private string base_model = String.Empty;
protected vehicle(string model)
{
this.base_model = model;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.