Для всех li
в #thing
, которые не являются первыми детьми:
$('#thing li:not(:first-child)')
Правильный подход:
public class AnotherObject : MyObjectBase {
public AnotherObject(IMyRequiredInterface interfaceImpl) :
base(interfaceImpl) {
}
}
Вы специально просили о подходе, отличном от этого. Почему?
Цель состоит в том, чтобы удовлетворить требования базового класса без того, чтобы дочерние классы ничего об этом знали.
Это вообще неправильный поступок. Почему вы хотите это сделать?
Основываясь на вашем последующем комментарии, вам, вероятно, следует использовать (и настроить свой контейнер для использования) внедрение свойств вместо внедрения конструктора. Это даст вам все ваши требования.
Здесь запах кода. Если вы наследуете класс, у которого есть конструктор без параметров, это означает, что автор этого базового класса предполагал, что он не может функционировать должным образом без предоставления необходимой зависимости. Если вы унаследуете от него и вызовете базовый метод, который требует этой зависимости, ваш код, вероятно, завершится ошибкой, если зависимость не указана. Поэтому, если вы действительно думаете, что вам следует полностью переопределить это поведение, вам не нужно наследовать от этого базового класса, иначе просто скопируйте конструктор в унаследованный класс.
Эээ ... весь смысл наследования от MyObjectBase
заключается в том, что вы как бы получаете хорошее и плохое, если говорить о поведении. Если вы не можете создать MyObjectBase
без объекта, реализующего IMyRequiredInterface
, вы также не можете создать подкласс без такого объекта.
Итак, что вы будете делать, если кто-то этого не сделает. Передаю тебе это. У вас есть значение по умолчанию?
Для подкласса вполне разумно создать экземпляр, реализующий IMyRequiredInterface
, и передать его конструктору суперкласса с помощью вызова super (...)
. Ты можешь это сделать? (Хотя, насколько я помню, на Java можно немного зациклиться,
Как насчет предоставления защищенного конструктора в базовом классе, который не принимает никаких параметров?
class MyBase
{
readonly int _x;
public MyBase(int x)
{
_x = x;
}
protected MyBase()
{
_x = 0;
}
}
class MyChild : MyBase
{
public MyChild()
{
}
}
Я бы сделал это:
public class AnotherObject:MyObjectBase
{
public AnotherObject():MyObjectBase(new RequiredInterfaceImplementation())
{
}
}
Где:
public class RequiredInterfaceImplementation:IMyRequiredInterface
{
... your implementation
}
Большинство фреймворков DI имеют функциональные возможности для внедрения сервисов в свойства (Property Setter Injection) с использованием атрибутов, так что вы можете попробовать это.
Вы можете создать подкласс, но подкласс должен знать, как создавать или получить реализацию интерфейса (используя ServiceLocator или что-то в этом роде).
С точки зрения DI ему нечего выполнять, потому что у класса есть только пустой конструктор (большинство используют конструктор с наибольшим количеством параметров) и нет атрибуты, говорящие ему делать что-нибудь еще.