2012-04-09 87 views
1

說我們有一個一流的馬鈴薯(因此實例),其具有被用於其他方法,但不是假裝的公共屬性光滑。該屬性在創建實例時設置,僅在實例內部使用。設計模式:保存私有成員

而且,我的系統應該支持多種數據庫驅動程序,因此我有一個接口「DATABSE適配器」,將與使用我想在目前使用的驅動程序類實例化。

現在出現這個問題。我需要的對象(馬鈴薯)持續的,並將其保存到數據庫中,因此,我通過使用數據庫適配器類拯救我們的土豆的平滑度,但..它是私有的! 如何發送馬鈴薯的平滑度,而不使其用於其他用途訪問?

預先感謝

+2

如何平滑屬性決定?如果它來自其他屬性,則不需要存儲它。如果不是,那麼它從哪裏來? – mellamokb 2012-04-09 21:20:29

+2

實現訪問 – zerkms 2012-04-09 21:20:56

+0

你有沒有想過使用私人二傳手?這樣,平滑度不能由實例外的任何人設置,但可以檢索。任何類(包括數據庫適配器)都需要讀取此值才能寫入數據庫。 – 2012-04-09 21:23:02

回答

2

編寫一種方法,允許對象以某種類型的作者爲參數保存自己。由於這是一個數據庫,因此您可能需要同時具有插入和更新方法,而不僅僅是一個Save方法。您也可以將它們放入界面中。

粗糙例如:

public interface IDatabaseSaveable 
{ 
    void InsertToDatabase(Database pDatabase); 
    void UpdateDatabase(Database pDatabase); 
} 

public class Potato : IDatabaseSaveable 
{ 
    private int mID; 
    private double mSmoothness; 

    public void InsertToDatabase(Database pDatabase) 
    { 
     pDatabase.InsertToPotatoes(mID, mSmoothness, ...); 
    } 

    public void UpdateDatabase(Database pDatabase) 
    { 
     pDatabase.UpdatePotatoes(mID, mSmoothness, ...); 
    } 
} 
1

這是在具有標記爲internal的平滑度的性質的變化。假設馬鈴薯在使用前必須有一個smoothness,那麼內部構造函數可能會更好。我會相信,有一個很好的理由來隱藏順暢。也許對土豆方面謙虛?

public class Potato 
{ 
    internal int Smoothness { get; set; } 

    internal Potato(int smoothness) 
    { 
     this.Smoothness = smoothness; 
    } 
    private Potato() { } 
} 

同一程序只有類可以使用內部的構造方法實例Potato。並且只有同一個程序集中的類才能訪問Smoothness(以便他們可以保存馬鈴薯)。

2

您可以創建一個導入/導出接口,一對外部化的Potato的「狀態」沒有給訪問它的實現細節(在這種情況下,它的私有成員和數據類型)。他們是建設者的類型。

public class Potato { 
    public interface IExporter { 
    void AddSmoothness(string value); 
    } 
    public interface IImporter { 
    string ProvideSmoothness(); 
    } 

    public Potato(IImporter importer) { 
    this.smoothness = int.Parse(importer.ProvideSmoothness()); 
    } 

    public void Export(IExporter exporter) { 
    exporter.AddSmoothness(this.smoothness.ToString()); 
    } 

    public Potato(int smoothness) { 
    this.smoothness = smoothness; 
    } 

    private int smoothness; 
} 

然後,你的數據庫適配器類將實施的相關接口,並使用相應的方法。看原始創意here