Универсальная проблема фабрики классов

Воспользуйтесь преимуществом того факта, что транспортер машинописи может указать вам, где в вашем коде есть опечатка. Например:

let body: {count: number, next: string, journals: Journal[]} = {"count": res["count"], "next": res["next"], "journals": []};


this.journalFactory.create(journalInfo, body.journals);
                                             // ^^^ Please notice typo here

Почти каждый IDE и процесс переноса будут выдавать ошибку, когда вы дадите информацию о типе для машинописного текста.

5
задан Vadim 29 April 2009 в 19:19
поделиться

3 ответа

Просто выведите IControl из IControl .

public interface IControl<T> : IControl
{
    T Value { get; }
}

ОБНОВЛЕНИЕ

Если я вас неправильно понял, а вы не хотите не универсальный интерфейс, вы должны будете также сделать метод GetControl () универсальным.

public IControl<T> GetControl<T>()
{
    if (typeof(T) == typeof(Boolean))
    {
        return new BoolControl(); // Will not compile.
    }
    else if (typeof(T) == typeof(String))
    {
        return new StringControl(); // Will not compile.
    }
    else
    {
        return null;
    }
}

Теперь у вас есть проблема, что новые элементы управления не могут быть неявно преобразованы в IControl , и вам придется сделать это явным.

public IControl<T> GetControl<T>()
{
    if (typeof(T) == typeof(Boolean))
    {
        return new (IControl<T>)BoolControl();
    }
    else if (typeof(T) == typeof(String))
    {
        return (IControl<T>)new StringControl();
    }
    else
    {
        return null;
    }
}

ОБНОВЛЕНИЕ

Изменено приведение с как IControl на (IControl ) . Это предпочтительнее, потому что это вызовет исключение, если есть ошибка, в то время как , поскольку IControl молча возвращает ноль .

5
ответ дан 14 December 2019 в 04:47
поделиться
public IControl<T> GetControl<T>()
{
    switch (typeof(T).Name)
    {
        case "Bool":
            return (IControl<T>) new BoolControl();
        case "String":
            return (IControl<T>) new StringControl();
    }
    return null;
}

Обновление; исправил пару ошибок в коде. Вот вызов, чтобы получить класс:

IControl<bool> boolControl = GetControl<bool>();
3
ответ дан 14 December 2019 в 04:47
поделиться

Тип возвращаемого значения должен быть универсальным, поскольку, ну, это так. Подумайте, как бы вы использовали это. Возврат строго типизированного объекта устраняет необходимость в универсальном фабричном методе.

Даже если бы вы могли это сделать, в чем заключается выигрыш в

IControl<bool> boolControl = controlFactory.GetControl("bool");

или тот, который будет работать,

IControl<bool> boolControl = controlFactory.GetControl<bool>("bool");

над определенным

IControl<bool> boolControl = controlFactory.GetBoolControl("bool");

В любом случае , у вас есть переключатель () на стороне клиента. Либо верните объект, либо используйте нетипизированный интерфейс IControl.

0
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: