insighter
@insighter
-First time? - Huh? (C#, React, JS)

Как правильно унаследоваться от обобщенного класса без ошибки компилятора?

Вытащил со своего приложения код (без лишней специфики), который приводит к ошибке компилятора.
public class DataObject
{
    public string Id { get; set; }
    public int ObjType { get; set; }
}

public class ReferredObject : DataObject
{
    public string Name { get; set; }
     public string Remark { get; set; }
}

public class Model<TDataObject> where TDataObject : DataObject, new()
{
}

// строка ниже, ошибка компилятора: CS0310
public class RefferedObjectModel<TDataObject> : Model<TDataObject>
    where TDataObject : ReferredObject
{
}


Текст ошибки:

'TDataObject' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TDataObject' in the generic type or method 'Program.Model'


Семантически "ReferredObject" можно считать абстрактным, но синтаксически это не так, какая претензия у компилятора?
И да, понятно, что все дело в опции "new()" указанной при объявлении класса Model.

Подскажите как реализовать подобный функционал, учитывая что RefferedObjectModel - это не конечный класс от него будет происходить наследование?
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
insighter
@insighter Автор вопроса
-First time? - Huh? (C#, React, JS)
Спасибо Антон Барышев за решение, нужно добавить опцию new()

public class RefferedObjectModel<TDataObject> : Model<TDataObject>
    where TDataObject : ReferredObject, new()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
какая претензия у компилятора?

У него нет публичного конструктора без параметров.
Но вообще не советую использовать ограничение new(), тк оно очень сильно замедляет код.
Ответ написан
AVollane
@AVollane
Начинающий C# разработчик
Здравствуйте.
А вам точно необходимо, чтобы тип в объявлении универсального класса имел открытый конструктор без параметров? Если убрать , new(), то всё без ошибок:
public class Model<TDataObject> where TDataObject : DataObject
    {
        public Model()
        {

        }
    }


Может вам просто убрать это ограничение, или оно нужно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы