2010-10-17 132 views
-1

我有與接口和抽象類相關的問題。 我會給你簡單的例子,這可以解釋我想要做什麼。所以,讓我們開始。如何在特定情況下使用接口創建對象

public interface A 
{ 
string param1 { set; get;} 
string param1 { set; get;} 
A CreateObject(string p1,string p2); 
} 

public class MyClass1 : A 
{ 
public string param1 { set; get; } 
public string param2 { set; get; } 
public A CreateObject(string p1,string p2) 
{ 
    var obj = new MyClass1(); 
    obj.param1 = p1; 
    obj.param2 = p2; 
    return obj; 
} 

} 
public class MyClass2 : A 
{ 
public string param1 { set; get; } 
public string param2 { set; get; } 
public A CreateObject(string p1,string p2) 
{ 
    var obj = new MyClass2(); 
    obj.param1 = p1; 
    obj.param2 = p2; 
    return obj; 
} 

} 


// I have little problem with this function 
public List<A> GetNodes(int count) 
{ 
    var lst_Objects = new List<a>(); 
       for(int i=0; i<count; i++) 
       { 
      string Param1 = GetParam1(); 
      string Param2 = GetParam2(); 
         lst_Objects.Add(new A.CreateObject(Param1,Param2); // but it defenitly doesn't work(wrong way) 
       } 
      return lst_Objects; 
} 

我有GetNodes函數的問題。 提示: MyClass1和MyClass2是Entity對象,因此我無法創建抽象類,並使用一些通用的方法來解決此問題。

我會感激你的想法

+0

你想要MyClass1還是MyClass2? – SLaks 2010-10-17 18:11:23

+0

哪類應該初始化那行代碼?我(一個人)不能選擇,關於電腦怎麼說? – AlexanderMP 2010-10-17 18:13:26

回答

0

你沒有提到A.CreateObject爲靜態,而其他具體類MyClass1的/ MyClass2留爲靜態。使用

lst_Objects.Add(MyClass1.CreateObject(參數1,參數2);

lst_Objects.Add(MyClass2.CreateObject(參數1,參數2);

代替

。另外要提到的是,您需要確保在兩個類中都定義了A.CreateObject,否則您需要將它們抽象成不是您想要的,而是從接口A中刪除非靜態方法CreateObject。

+0

好的。我有想法。如果我創建了一些通用類,如:public class UniversalClass:A { public string param1 {set;得到; } public string param2 {set;得到; } public static CreateObject(string p1,string p2) var obj = new MyClass1(); obj.param1 = p1; obj.param2 = p2; return obj; } 然後我將使用這個類來獲取GetNodes()函數。 我將創建通用類的對象。然後我將它轉換爲myclass1或myclass2對象。這是個好主意嗎? – Leonid 2010-10-17 18:36:17

+0

爲什麼你需要靜態的CreateObject?你想創建一個SingleTon嗎? 是的,你可能可以做,但我會建議使用UniversalClass,不要把任何繼承放在那裏,而是編寫你的靜態CreateObject來創建基於你的具體類型,如MyClass1/MyClass2的類 – abhishek 2010-10-17 19:25:49

+0

還必須注意靜態成員不允許在一個接口內,如果你想在一個類型上有一個靜態方法,使用擴展方法。 – abhishek 2010-10-17 19:31:51

0

您的接口聲明瞭一個CreateObject方法,這兩個類都沒有實現。你的類實現了一個靜態的CreateObject,它不滿足接口。接口不能聲明靜態成員。

+0

我知道。但問題是「如何創建對象,它將具有類型A,然後將此對象轉換爲我想要的類型,在此狀態下,我不知道我有什麼對象。 – Leonid 2010-10-17 18:32:30

0

我有不好的解決方案。我會喜歡這個創建類:

public class Universal: A 
{ 
public string param1 { set; get; } 
public string param2 { set; get; } 
public static A CreateObject(string p1,string p2) 
{ 
    var obj = new MyClass1(); 
    obj.param1 = p1; 
    obj.param2 = p2; 
    return obj; 
} 

功能GetNodes將有外觀是這樣的:

public List<A> GetNodes(int count) 
{ 
    var lst_Objects = new List<a>(); 
       for(int i=0; i<count; i++) 
       { 
         string Param1 = GetParam1(); 
         string Param2 = GetParam2(); 
         lst_Objects.Add(Universal.CreateObject(Param1 ,Param2)); 
       } 
      return lst_Objects; 
} 

該函數將返回其具有A型(我很容易地轉換成MyClass1的或myclass2對象的列表對象。

是不是好主意?

感謝您的關注。

相關問題