2014-09-26 18 views
0

讀什麼我想實現是這樣的如何設置靜態的財產和家長

// Base class 
public Class ActiveRecord { 
    public static string CollectionName; 

    public static Collection() { 
     return CollectionInstance(CollectionName); // just pseudo code 
    } 
} 

// Child class 
public Class Post : ActiveRecord 
{ 
    public static string CollectionName = "posts"; 
} 

我知道,PHP的AR以這種方式工作(也許在紅寶石),但不知道如何實現這一目標在C#中還是有另一種方法來實現這一點?

+0

不與靜態。儘管你可以用實例屬性來完成它。 – Mrchief 2014-09-26 04:57:51

+0

如果不想實例化一個模型來查詢它,就像AR一樣,如果沒有其他方法,我會嘗試你的解決方案,你有什麼建議?...... – norman784 2014-09-26 20:10:39

回答

0

你不能用靜態字段或靜態構造函數來做到這一點。請注意,在C#中,靜態構造函數的執行順序爲not under your control

用戶無法控制何時在程序中執行靜態構造函數。

因此,您不能保證派生的構造函數將首先執行並設置CollectioName。

此外,你正在做的事情是不可能的,因爲基礎構造函數是在任何派生構造函數被調用之前先執行的。

而且,你不能返回從構造什麼,所以這種說法是無效的:

return CollectionInstance(CollectionName); // just pseudo code 

你可以做的是這樣的:

// Base class 
public class ActiveRecord { 

    public ActiveRecord(string name) { 
     CollectionInstance = new CollectionInstance(name); // just pseudo code 
    } 
} 

// Child class 
public class Post : ActiveRecord 
{ 
    public Post(): base("posts"){} 
} 

或本:

// Child class 
public class Post : ActiveRecord 
{ 
    private static readonly string CollectionName = "posts"; 
    public Post(): base(CollectionName){} 
} 
+0

但是,只有郵政初始化,這隻會工作?像Post post = new Post(); 因爲AR使用了靜態方法Post.Find() – norman784 2014-09-26 20:07:15

+0

從靜態類派生沒有意義。你可能會嘗試的是[Singleton](http://csharpindepth.com/articles/general/singleton.aspx#lazy)模式。在你的情況下,'Posts.Find()'將使用'Instance'或'Collection'來完成它的工作。 – Mrchief 2014-09-26 21:01:02

+0

是的,單身人士必須完成我想要的... – norman784 2014-09-30 04:05:16

0

從mu的理解,你不能重寫在c#中的靜態屬性。

如果您想覆蓋它,您需要將其更改爲實例屬性,然後可以覆蓋它。

// Base class 
public Class ActiveRecord { 
    public virtual string CollectionName {get;} 

    public static Collection() { 
     return CollectionInstance(CollectionName); // just pseudo code 
    } 
} 

// Child class 
public Class Post : ActiveRecord 
{ 
    public override string CollectionName { get{ return "posts";}} 
} 
+0

沒有像C#中的虛擬域那樣的東西。 – Mrchief 2014-09-26 05:59:22

+0

@Mrchief是的,代碼是一個錯誤,如果你閱讀我的答案,我正在談論屬性 – 2014-09-26 06:02:48

+0

這就是我所希望的。你仍然有無效的代碼。 – Mrchief 2014-09-26 06:04:10