Могу ли я заставить потомков иметь конструктор без параметров? - PullRequest
10 голосов
/ 26 декабря 2011

Я пытаюсь создать общий механизм, похожий на шаблон фабрики.

Завод будет выглядеть так:

public class APlugin<ActionType> where ActionType : IAction
{
    // create a new action. Note: ActionType should contain
    // an empty constructor
    public ActionType CreateAction()
    {
        return Activator.CreateInstance<ActionType>();
    }
}

Потомки IAction могут скрывать конструктор без параметров, и это приведет кфабрика рухнет.

Ответы [ 3 ]

11 голосов
/ 26 декабря 2011

Вы можете убедиться, что класс имеет конструктор без аргументов, предоставив общее ограничение where T : new(). Это повлияет только на тип T. Содержащий класс не будет затронут, поэтому вы можете убедиться, что в вашем случае ActionType есть указанный конструктор, но вы не можете применить его к любому классу, унаследованному от APlugin<T>.

8 голосов
/ 26 декабря 2011

Вы не можете принудительно использовать пустой конструктор или конструктор любого типа для производных типов.

Конструкторы не наследуются, но их вызывают.

Если нет цепочки для базового конструктора(используя синтаксис : base()), базовый конструктор по умолчанию будет вызываться неявно.

С Использование конструкторов в MSDN:

В производном классеесли конструктор базового класса не вызывается явно с использованием ключевого слова base, то конструктор по умолчанию, если он есть, вызывается неявно.

0 голосов
/ 30 августа 2016

Довольно поздно, но я думаю, что это стоит знать ..

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

public interface IEmptyConstructor<TThis> where TThis : IEmptyConstructor<TThis>, new() {}

например, одноэлементная структура

public abstract class Singleton<TThis> : ISingleton where TThis : Singleton<TThis>, new() { /* some singleton madness */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...