Войти
ПрограммированиеФорумОбщее

Нужна помощь middle\senior

#0
20:05, 19 июля 2021

Никак не доходит до меня, как решить эту задачку?

Ниже представлена часть кода, реализующая абстрактную настройку экземпляров классов
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();
}
}


#1
(Правка: 20:09) 20:08, 19 июля 2021

Вот вариант более понятный, но не законченный

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();
    }
}

#2
0:25, 20 июля 2021

futunn
Напишите универсальную фабрику, подобную следующей

+ Показать
#3
(Правка: 15:17) 15:15, 9 окт 2021

Задача сформулирована не понятно, трактовать цель можно почти как угодно.
Если воспринять дословно текст задачи, то вот, пожалуйста:

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 методов?

#4
11:37, 12 окт 2021

Ребзи, впринципе паттерн фабрик и вот это вот все - оверинжиниринг и ооп ради ооп(еще и с темплейтами). Зачем вам это? Я за весь свой опыт как начал прогать лет в 10 понял что от абстракций нужно убегать и пилить кисс чтобы хоть как то что то закончить)

ПрограммированиеФорумОбщее