2010-10-17 95 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对象的列表对象。

是不是好主意?

感谢您的关注。

相关问题