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

Я пытаюсь сделать следующее:

class Program
{
    static void Main(string[] args)
    {
        foo<baz> fooObject = new foo<baz>();
        AnotherClass<baz> _baz = new AnotherClass<baz>();
        _baz.testMethod(fooObject);
    }
}

public class AnotherClass<T> where T : bar
{
    public void testMethod(foo<T> dummy)
    {
        foobar = dummy;
    }

    private foo<T> foobar = null;
}

public class foo<T> where T : bar, new()
{
    public foo()
    {
        _t = new T();
    }

    private T _t;

}

public abstract class bar
{
    public abstract void someMethod();
    // Some implementation
}

public class baz : bar
{
    public override void someMethod()
    {
        //Implementation
    }
}    

И я получаю ошибку при объяснении, что 'T' должен быть неабстрактным типом с общедоступным конструктором без параметров для использования его в качестве параметра 'T' в универсальном типе или методе. Я полностью понимаю, почему это должно быть, и также понимать, что я мог передать предварительно инициализированный объект типа 'T' в как аргумент конструктора для избегания необходимости 'новый' это, но являюсь там каким-либо путем вокруг этого? какой-либо способ осуществить классы, которые происходят из 'панели' для предоставления конструкторов без параметров?

Зафиксированный - я отсутствовал 'новый ()' ограничение на AnotherClass ().

7
задан Ben Heymink 16 April 2010 в 21:50
поделиться

5 ответов

Разве вы не упускаете ограничение new () для вашего AnotherClass?

public class AnotherClass<T> where T : bar, new()

Без этого VS2010 отказывается компилироваться, с этим он работает нормально.

5
ответ дан 6 December 2019 в 19:34
поделиться

Правильный синтаксис:

public class foo<T> where T : bar, new()
7
ответ дан 6 December 2019 в 19:34
поделиться

Разве общий синтаксис new () не просто new?

Кроме того, вы выполняете этот код в середине класса, а не в функции, что наверняка сбивает его с толку:

_t = new T();

Изменить:

Хорошо, поэтому после очистки синтаксиса я предполагаю, что проблема в том, что у 'baz' нет конструктора без параметров. Я не знаю, каким образом вы можете добиться этого.

Здесь есть аналогичный вопрос , который может немного помочь.

0
ответ дан 6 December 2019 в 19:34
поделиться

Ваш код компилируется в VS2010.

Вы, вероятно, захотите использовать вместо этого интерфейсы:

public class foo<T> where T : ibar, new()
...

public interface ibar
{
    void someMethod();
}

public abstract class bar : ibar
{
    public abstract void someMethod();
    // Some implementation
}
1
ответ дан 6 December 2019 в 19:34
поделиться

Как обходной путь - вы можете передать делегату создание экземпляра типа, который вы нужно:

  Func<T> creator = ...

  _t = creator();
0
ответ дан 6 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

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