У меня есть требование рефакторинга кода, в котором у меня есть несколько классов, и объект классов должен создаваться динамически в зависимости от пользовательского запроса. Теперь все классы существуют и в них нет общих методов, которые бы соответствовали друг другу. Поэтому я не могу добавить к нему интерфейс и создать фабричный класс, который вернет ссылку на интерфейс, ссылающуюся на фактический класс. Есть ли способ с генериками или любым другим способом реорганизовать это, чтобы динамически создавать объекты. Подход, который мы имеем сейчас, состоит в том, что существует основной класс, в котором объект каждого класса создается и все методы вызываются. Можем ли мы реализовать заводскую модель без интерфейса или любого решения для моего сценария? Пожалуйста.Реализация FactoryPattern без использования интерфейса C#
Добавление образца кода для объяснения сценария.
public interface ITest
{
string TestMethod1(string st, int ab);
int TestMethod2(string st);
void TestMethod4(int ab);
float ITest.TestMethod3(string st);
}
public class Class1 : ITest
{
public string TestMethod1(string st, int ab)
{
return string.Empty;
}
public void TestMethod4(int ab)
{
throw new NotImplementedException();
}
public int TestMethod2(string st)
{
throw new NotImplementedException();
}
public float TestMethod3(string st)
{
throw new NotImplementedException();
}
}
public class Class2 : ITest
{
float ITest.TestMethod3(string st)
{
return float.Parse("12.4");
}
void ITest.TestMethod4(int ab)
{
throw new NotImplementedException();
}
public string TestMethod1(string st, int ab)
{
throw new NotImplementedException();
}
public int TestMethod2(string st)
{
throw new NotImplementedException();
}
}
public class Main
{
ITest test = null;
public ITest CreateFactory(TestType testType)
{
switch(testType)
{
case TestType.Class1:
test = new Class1();
break;
case TestType.Class2:
test = new Class2();
break;
}
return test;
}
}
enum TestType
{
Class1,
Class2
}
Так, как и в предыдущем, у меня не может быть интерфейса, потому что в нем нет общих методов. Итак, какие другие решения я могу иметь, если у меня есть пустой интерфейс или абстрактный метод, как это поможет. Даже если я поместил один общий метод в интерфейс, и все его реализуют, поскольку я передаю ссылку на интерфейс, я могу получить доступ только к общему методу из ссылки на интерфейс.
Моя идея - использовать что-то вроде приведенного ниже, но не уверен, что тип возвращаемого значения будет или должен быть определен как.
public T CreateFactory(TestType testType)
{
switch(testType)
{
case TestType.Class1:
return GetInstance<Class1>("Class1");
case TestType.Class2:
return GetInstance<Class1>("Class2");
}
return null;
}
public T GetInstance<T>(string type)
{
return (T)Activator.CreateInstance(Type.GetType(type));
}
Как определить Т здесь, в свою очередь моя забота, и как я могу вызвать его, если кто-нибудь может помочь с этим, я думаю, что я близок к разгадке.
Ответ на мою проблему
public static T CreateFactory<T>()
where T: IFactory, new()
{
return new T();
}
создать пост на http://codereview.stackexchange.com или вставить код здесь иначе это только теоретическая дискуссия –
Как вы узнаете позже (после создания объектов), как обращаться или какие методы нужно вызывать? Эта логика может помочь решить вашу проблему. –
моя проблема в этом. У меня есть класс, который создает объекты указанного типа и возвращает созданный объект, однако для его возврата мне нужно отбросить его или преобразовать или иметь интерфейс, который реализуется всеми моими классами, а затем вернуть этот интерфейс ref, но У меня не может быть интерфейса здесь bcoz нет общих методов, так что я могу сделать в этом случае? – Blossom