Никак не доходит до меня, как решить эту задачку?
Ниже представлена часть кода, реализующая абстрактную настройку экземпляров классов
ObjectA и ObjectB неким API. Необходимо реализовать два метода: SetupObjectA и
SetupObjectB, используя Generic-возможности языка и Extension-методы таким образом,
чтобы метод SetupObjectA был доступен только при передаче в метод For аргумента типа
ObjectA, а метод SetupObjectB при передаче аргумента типа ObjectB.
public struct ApiSetup<T>
{ }
class Api
{
public ApiSetup<T> For<T>(T obj)
{
return new ApiSetup<T>();
}
}
interface ISomeInterfaceA
{ }
interface ISomeInterfaceB
{ }
public class ObjectA : ISomeInterfaceA
{ }
public class ObjectB : ISomeInterfaceB
{ }
class SomeClass
{
public void Setup()
{
Api apiObject = new Api();
apiObject.For(new ObjectA()).SetupObjectA();
apiObject.For(new ObjectB()).SetupObjectB();
}
}
Вот вариант более понятный, но не законченный
public struct ApiSetup<T>
{
}
class Api
{
public ApiSetup<T> For<T>(T obj)
{
return new ApiSetup<T>();
}
}
interface ISomeInterfaceA
{
void SetupObjectA();
}
interface ISomeInterfaceB
{
void SetupObjectB();
}
class ObjectA : ISomeInterfaceA
{
public void SetupObjectA()
{
}
}
public class ObjectB : ISomeInterfaceB
{
public void SetupObjectB()
{
}
}
class SomeClass : MonoBehaviour
{
public void Setup()
{
Api apiObject = new Api();
apiObject.For(new ObjectA()).SetupObjectA();
apiObject.For(new ObjectB()).SetupObjectB();
}
}
futunn
Напишите универсальную фабрику, подобную следующей
Задача сформулирована не понятно, трактовать цель можно почти как угодно.
Если воспринять дословно текст задачи, то вот, пожалуйста:
public struct ApiSetup<T> { public T targetObject; } class Api { public ApiSetup<T> For<T>(T obj) { return new ApiSetup<T> { targetObject = obj }; } } interface ISomeInterfaceA { } interface ISomeInterfaceB { } public class ObjectA : ISomeInterfaceA { } public class ObjectB : ISomeInterfaceB { } class SomeClass { public void Setup( ) { Api apiObject = new Api( ); apiObject.For( new ObjectA( )).SetupObjectA( ); apiObject.For( new ObjectB( )).SetupObjectB( ); } } //Solution: public static class ApiSetupExtensions { public static ApiSetup<T> SetupObjectA<T>( this ApiSetup<T> setup) where T : ObjectA { //setup.targetObject <- do something return setup; } public static ApiSetup<T> SetupObjectB<T>( this ApiSetup<T> setup) where T : ObjectB { //setup.targetObject <- do something return setup; } }
Реализовано ровно 2 метода SetupObjectA и SetupObjectB. Используют Generic-возможности языка и являются Extension-методами. SetupObjectA доступен если передан ObjectA в For, SetupObjectB доступен если передан ObjectB.
Зачем в коде интерфейсы - не ясно. Быть может имелось в виду "при передаче в For типов ISomeInterfaceA или ISomeInterfaceB"? Достаточно для этого поменять констрейны where в extension методах.
Задачка на подумать:
Если ApiSetup<T> является структурой и в ней после сетапа объекта должен быть сохранён какойто контекст/конфиг (и ещё хуже если он большой в плане занимаемой памяти), то где во всём этом коде проблема и как она связана с this аргументом extension методов?
Ребзи, впринципе паттерн фабрик и вот это вот все - оверинжиниринг и ооп ради ооп(еще и с темплейтами). Зачем вам это? Я за весь свой опыт как начал прогать лет в 10 понял что от абстракций нужно убегать и пилить кисс чтобы хоть как то что то закончить)
Тема в архиве.