Почему нам не разрешают указать конструктора в интерфейсе? [дубликат]

Вы можете использовать ItemsControl с ItemTemplate. Свяжите ItemsControl со свойством public collection и добавьте UserControl к ItemTemplate:

<ItemsControl ItemsSource="{Binding TheListProperty}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- The UserControl will inherit the current item in 'TheListProperty' as its DataContext -->
            <local:UserControlX />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Убедитесь, что вы явно не установили DataContext из UserControl , Он должен наследовать его DataContext от текущего элемента в ItemsControl.

51
задан Community 23 May 2017 в 02:18
поделиться

7 ответов

Поскольку интерфейс описывает поведение. Конструкторы не являются поведением. То, как объект создается, является деталью реализации.

89
ответ дан cletus 7 November 2019 в 09:50
поделиться

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

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

28
ответ дан Pang 7 November 2019 в 09:50
поделиться

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

public abstract class ClassOne
{
    protected int _x;
    protected string _s;

    public ClassOne(int x, string s)
    {
        _x = x;
        _s = s;
    }        
}

Уведомление там не является никакими конструкторами, который не берет аргумента (конструктор по умолчанию), что означает любой класс, который наследовался ClassOne, должен вызвать конструктора, который имеет 2 аргумента.

Таким образом, это не допустимо и не скомпилирует.

public class ClassTwo : ClassOne
{
    public ClassTwo() 
    { }
}

Однако это допустимо и скомпилирует.

public class ClassTwo : ClassOne
{
    public ClassTwo(int x, string s) : base(x, s)
    {  }
}

Я хотел бы указать здесь, что в C# можно только наследоваться одному базовому классу. Подразумевать, что это не может быть правильным решением для конкретной ситуации, но является чем-то для размышления о.

Tony.

9
ответ дан Tony 7 November 2019 в 09:50
поделиться

Среди всех других причин, уже отправленных, сохраните также в памяти, класс может легко реализовать несколько интерфейсов; какой конструктор должен использоваться затем?

8
ответ дан M.Turrini 7 November 2019 в 09:50
поделиться

Поскольку Вы наклоняетесь, инстанцируют интерфейса, таким образом, constructur doenst имеет смысл.

0
ответ дан Mork0075 7 November 2019 в 09:50
поделиться

Другие ответы уже указали, почему не имеет смысла иметь объявление конструктора в интерфейсе. Но от Вашего вопроса, я предполагаю, что Вы, вероятно, ищете шаблон "абстрактная фабрика".

Дать пример на основе Вашего вопроса: Вы говорите, что требуется так или иначе объявить, что 'механизм' должен быть передан конструктору. Можно сделать это путем объявления отдельного интерфейса для сервиса конструкции как это:

public interface IGadgetFactory
{
   IGadget CreateGadget(Engine engine);
}

Любой код, который должен создать IGadget экземпляры могут затем использовать IGadgetFactory экземпляр вместо того, чтобы вызвать любых конструкторов непосредственно.

6
ответ дан Wim Coenen 7 November 2019 в 09:50
поделиться

Помимо других объяснений, данных здесь, необходимо было бы изобрести новый синтаксис для вызова их так или иначе, с тех пор если у Вас есть две или больше реализации в объеме в строке:

Dim x as new IDoStuff()

Реализацию Whice называют?

0
ответ дан Damien_The_Unbeliever 7 November 2019 в 09:50
поделиться