Как создать объект с использованием интерфейса в конкретном случае - PullRequest
0 голосов
/ 17 октября 2010

У меня есть вопрос, связанный с интерфейсами и абстрактными классами.Я приведу простой пример, который может объяснить, что я хочу сделать.Итак, начнем.

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, и по этой причине я не могу создать абстрактный класс и использовать какой-то универсальный для решения этой проблемы.

Буду благодарен за ваши идеи

Ответы [ 3 ]

0 голосов
/ 17 октября 2010

Ваш интерфейс объявляет метод CreateObject, который не реализует ни один из ваших классов. Ваши классы реализуют статический CreateObject, который не удовлетворяет интерфейсу. Интерфейсы не могут объявлять статические члены.

0 голосов
/ 17 октября 2010

У меня плохое решение. Я создам класс так:

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.

Это хорошая идея?

Спасибо за внимание.

0 голосов
/ 17 октября 2010

Вы не упомянули A.CreateObject как статический, в то время как другой конкретный класс MyClass1 / MyClass2 остался статическим.Используйте

lst_Objects.Add (MyClass1.CreateObject (Param1, Param2);

или

lst_Objects.Add (MyClass2.CreateObject (Param1, Param2);

вместо.

Также следует упомянуть, что вы должны убедиться, что вы определили A.CreateObject в обоих классах, в противном случае вам нужно сделать их оба абстрактными, а это не то, что вам нужно. Скорее удалите нестатическийметод CreateObject из интерфейса A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...