3

在C#中,你有對象初始化初始化對象at creation time without using a constructor的領域。C#中的類初始化器是否可能?

現在我想知道是否有相當於類,這意味着您可以在定義子類時'初始化'類的屬性,而無需實際使用覆蓋語法,只需聲明已知屬性的值即可。

例子:

public abstract class Car { 
    public abstract string Name { get; } 
} 
// usual approach 
public class Mustang : Car { 
    public overwrite string Name { get { return "Ford Mustang"; } } 
} 
// my idea of avoiding boilerplate code 
public class Mustang : Car { Name = "Ford Mustang" } 

有沒有辦法做到這一點?如果沒有,T4模板可以有幫助嗎?

+0

沒有直接關係到你的實際問題,但目前還沒有'overwrite'關鍵字,這是'override'。 – hvd

+0

@hvd謝謝,我只是再混合這兩個詞:-)。 – Bastian

回答

6

爲了讓rekire的例子更清晰,你會寫這樣的:

public abstract class Car 
{ 
    public string Name { get; private set; } 

    protected Car(string name) 
    { 
     this.Name = name; 
    } 
} 

public class Mustang : Car 
{ 
    public Mustang() : base("Mustang") 
    { 
    } 
} 

編輯:另一種選擇是使用屬性,在那裏你會寫:

[CarName("Mustang")] 
public class Mustang : Car 

...有在Car中寫下適當的反射碼。我會強烈建議你不要。當然,屬性在您的真實上下文中可能會有用。

+0

不錯的例子,很難在移動設備上編寫這樣的例子。 – rekire

+0

那麼這也可以完成這項工作,但如果可能的話,我想進一步縮寫代碼量(這就是爲什麼我想出了T4模板)。 – Bastian

+0

@Bastian:像這樣的屬性真的會佔用大量的代碼嗎?如果是這樣,那表明重新設計可能是有序的。如果你只是想減少*行*的數量,你總是可以把整個Mustang構造函數放在一行上。或者你也可以使用屬性。 –

1

你可以通過construtor,你需要調用基類的構造函數做到這一點。

class car { 
    Public string Name {public get; protected set} 
} 

這應該基本上工作。

+0

但是我更喜歡構造函數的版本,這意味着你可以保證這個名字在構造後永遠不會改變。 –