Внедрение зависимости и наследование классов

Для всех li в #thing, которые не являются первыми детьми:

$('#thing li:not(:first-child)')

см. http://api.jquery.com/not-selector/

13
задан Cœur 29 May 2018 в 13:32
поделиться

6 ответов

Правильный подход:

public class AnotherObject : MyObjectBase {
    public AnotherObject(IMyRequiredInterface interfaceImpl) : 
        base(interfaceImpl) {
    }
}

Вы специально просили о подходе, отличном от этого. Почему?

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

Это вообще неправильный поступок. Почему вы хотите это сделать?

Обновление:

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

18
ответ дан 1 December 2019 в 22:08
поделиться

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

1
ответ дан 1 December 2019 в 22:08
поделиться

Эээ ... весь смысл наследования от MyObjectBase заключается в том, что вы как бы получаете хорошее и плохое, если говорить о поведении. Если вы не можете создать MyObjectBase без объекта, реализующего IMyRequiredInterface , вы также не можете создать подкласс без такого объекта.

Итак, что вы будете делать, если кто-то этого не сделает. Передаю тебе это. У вас есть значение по умолчанию?

Для подкласса вполне разумно создать экземпляр, реализующий IMyRequiredInterface , и передать его конструктору суперкласса с помощью вызова super (...) . Ты можешь это сделать? (Хотя, насколько я помню, на Java можно немного зациклиться,

4
ответ дан 1 December 2019 в 22:08
поделиться

Как насчет предоставления защищенного конструктора в базовом классе, который не принимает никаких параметров?

    class MyBase
{
    readonly int _x;
    public MyBase(int x)
    {
        _x = x;
    }

    protected MyBase()
    {
        _x = 0;
    }
}

class MyChild : MyBase
{
    public MyChild()
    {

    }
}
0
ответ дан 1 December 2019 в 22:08
поделиться

Я бы сделал это:

public class AnotherObject:MyObjectBase
{
 public AnotherObject():MyObjectBase(new RequiredInterfaceImplementation())
 {
 }
}

Где:

public class RequiredInterfaceImplementation:IMyRequiredInterface
{
 ... your implementation
}
0
ответ дан 1 December 2019 в 22:08
поделиться

Большинство фреймворков DI имеют функциональные возможности для внедрения сервисов в свойства (Property Setter Injection) с использованием атрибутов, так что вы можете попробовать это.

Вы можете создать подкласс, но подкласс должен знать, как создавать или получить реализацию интерфейса (используя ServiceLocator или что-то в этом роде).

С точки зрения DI ему нечего выполнять, потому что у класса есть только пустой конструктор (большинство используют конструктор с наибольшим количеством параметров) и нет атрибуты, говорящие ему делать что-нибудь еще.

0
ответ дан 1 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

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