2014-10-18 155 views
0

我正在編寫一個類庫供我們公司的一些工程軟件使用。該庫用於定義結構鋼形狀的屬性。在我的每個類對象中,我都需要去指定的文件夾並查找一些xml數據。如何在C#中的一個類的多個實例之間共享一個值?

我怎麼能建立一個共同的變量我可以設置庫類外實例篩選之間共享(如下面的代碼是可能的)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string someCommonVarialble = @"c:\some\path\where\the\xmlData\are\stored"; 

     // create some steel shapes 
     SteelBeamShape myBeam1 = new SteelBeamShape("W6x9"); 
     SteelBeamShape myBeam2 = new SteelBeamShape("W10x22"); 
     SteelPipeShape myPipe1 = new SteelPipeShape("10odx.375wall"); 
     SteelPipeShape myPipe2 = new SteelPipeShape("24odx.750wall"); 

     // do some work with objects here 
    } 
} 

public class SteelBeamShape 
{ 
    // constructor 
    public SteelBeamShape(string SteelBeamNominalValue) 
    { 
     // look up some properties base on nominal value in XML tables 
     this.xmlDataPath = someCommonVariable; 

     // do stuff .... 
    } 
} 

public class SteelPipeShape 
{ 
    // constructor 
    public SteelPipeShape(string SteelPipeNominalValue) 
    { 
     // look up some properties base on nominal value in XML tables 
     this.xmlDataPath = someCommonVariable; 

     // do stuff .... 
    } 
} 

}

回答

0

要在不同的類之間共享一個共同的值,您需要從共同祖先派生的類。你的情況,你可以定義

public class SteelShape 
{ 
    public static string commonPath {get;set;} 
    ... add other common functionality .... 
    ... for example, how to load the xml file .... 
    public static XDocument LoadData(string fileName) 
    { 
     ...... 
    } 
} 

那麼你的類從這個基類

public class SteelPipeShape : SteelShape 
{ 
    .... 
} 

得到時,你需要使用祖先類指的是你提到它通過你的類的實例共享的公共變量命名

SteelShape.commonPath; 

所以把所有在一起,你有

void Main() 
{ 
    // Set the path once and for all 
    SteelShape.commonPath = @"d:\temp"; 

    SteelBeamShape myBeam1 = new SteelBeamShape("W6x9"); 
    SteelBeamShape myBeam2 = new SteelBeamShape("W10x22"); 
    SteelPipeShape myPipe1 = new SteelPipeShape("10odx.375wall"); 
    SteelPipeShape myPipe2 = new SteelPipeShape("24odx.750wall"); 
} 

public abstract class SteelShape 
{ 
    public static string commonPath {get;set;} 
    public static XDocument LoadData(string fileName) 
    { 
     ...... 
    } 
} 

public class SteelPipeShape : SteelShape 
{ 
    public SteelBeamShape(string SteelBeamNominalValue) 
    { 
     this.xmlDataPath = SteelShape.commonPath; 
     XDocument doc = SteelShape.LoadData("steelbeamshape.xml"); 
     // do stuff .... 
    } 
} 
public class SteelBeamShape : SteelShape 
{ 
    public SteelPipeShape(string SteelPipeNominalValue) 
    { 
     // look up some properties base on nominal value in XML tables 
     this.xmlDataPath = SteelShape.commonPath; 
     XDocument doc = SteelShape.LoadData("steelpipeshape.xml"); 

     // do stuff .... 
    } 
} 
+1

謝謝史蒂夫,這對我有幫助。我不得不做一些關於靜態變量的研究。我一直認爲靜態對於實例來說是靜態的。我沒有意識到可以像這樣使用靜態變量。在創建實例之前,我也採用了pln的加載表的建議。所以我在最後的解決方案中做了什麼,是設置我的對象類,以便他們將繼承一個共同的基類,正如你所建議的。但是我使靜態成員成爲一個DataSet,它被加載到我的主程序的初始化部分。那樣我就不用每次都加載它了,因爲我們建議使用 – 2014-10-20 17:23:30

+0

看來你已經很好地理解了靜態的概念。好工作 – Steve 2014-10-20 17:25:40

0

您可以通過這樣做從公共基類繼承所有Shape類,並在基類中將公共變量定義爲protected staticpublic static

public abstract class BaseShape 
{ 
    public static string mSomeVar = "SomeValue"; 
} 

public class SteelBeamShape : BaseShape 
{ 
    // constructor 
    public SteelBeamShape(string SteelBeamNominalValue) 
    { 
     // look up some properties base on nominal value in XML tables 
     this.xmlDataPath = this.mSomeVar; 

     // do stuff .... 
    } 
} 

public class SteelPipeShape : BaseShape 
{ 
    // constructor 
    public SteelPipeShape(string SteelPipeNominalValue) 
    { 
     // look up some properties base on nominal value in XML tables 
     this.xmlDataPath = this.mSomeVar; 

     // do stuff .... 
    }  
} 
0
public class Lib 
{ 
    private static string _commonVarialble; 

    public static string CommonVarialble 
    { 
     get { return _commonVarialble; } 
     set { _commonVarialble = value; } 
    } 

    public class SteelBeamShape 
    { 
     // constructor 
     public SteelBeamShape(string steelBeamNominalValue) 
     { 
      // look up some properties base on nominal value in XML tables 
      this.xmlDataPath = CommonVarialble; 

      // do stuff .... 
     } 
    } 
} 

現在,您可以設置CommonVarialble您的類庫外

5

我會考慮先加載XML數據,然後既可以通過構造函數或類中的方法進行實際發送數據工作。

否則,你可能在你的類中做了基本相同的事情(加載數據,查找XML數據等)中的代碼重複。

+0

你說得對。我看到,如果每次創建對象時不需要重新加載表,這將如何更高效。我提出了你的建議,並將其納入我的解決方案中。 – 2014-10-20 18:20:57

相關問題