2016-10-14 3 views
1

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

Ошибка

CS7036 Ошибка Там не аргумент, учитывая, что соответствует требуется формальный параметр 'Propa' ...

Базовый класс

public abstract class BaseClass<T> where T:class 
{ 
    public string propA{ get; set; } 
    public int propB{ get; set; } 
    public IEnumerable<T> propC { get; set; } 

    public BaseClass(string propA, int propB, IEnumerable<T> propC) 
    { 
     this.propA = propA; 
     this.propB = spropB; 
     this.propC = propC; 
    } 

    public abstract IEnumerable<T> Method1(); 

    public abstract string Method2(); 

    public abstract void Method3(); 
} 

Производный класс

public class DerivedClass: BaseClass<SomeClass> 
{ 
    public override IEnumerable<SomeClass> Method1() 
    { 
     //Code Here 
    } 

    public override string GetDefaultSortField() 
    { 
     //Code Here 
    } 

    public override void SetSortParams() 
    { 
     //Code Here 
    } 
} 
+0

Возможно, вместо абстрактного базового класса вы должны использовать интерфейс (например, 'IBaseClass '). Затем вы можете проектировать конструкторы на основе ваших потребностей. – Jure

+6

Это не имеет ничего общего с абстрактными классами или дженериками - это просто вопрос конструктора по умолчанию в производном классе, вызывающий конструктор в базовом классе, не передающий аргументы. Ваш базовый класс может быть конкретным и неэквивалентным, и у вас будет такая же проблема. Что вы хотите, если вы вызываете 'new DerivedClass()'? Вы ожидаете, что трехкомпонентный конструктор в «BaseClass» будет вызван, и если да, то какие аргументы вы ожидаете получить от него? –

+0

С VS2015 F10 также помогает автоматически создавать этот производный конструктор –

ответ

4

У вас нет явного конструктора в производном классе, так что «наследует» конструктор базового класса. Но конструктор базового класса имеет параметр, который использует общий тип T, который не определен в производном классе. Если вы добавите конструктор явно в производный класс, это должно быть хорошо. Я имею в виду, как это:

public DerivedClass(string propA, int propB, IEnumerable<SomeClass> propC) 
     : base(propA, propB, propC) 
    { 
    } 

Обратите внимание, что этот способ, становится IEnumerable<SomeClass>IEnumerable<T> в базовом классе, так как общий параметр типа Т связан с SomeClass в DerivedClass.

2

Вы пропустили constructor в DerivedClass. Но поскольку конструктор по умолчанию в базовом классе содержит три параметра, вам нужно вызвать соответствующий базовый конструктор. Так добавить этот конструктор в DerivedClass и он будет решать проблему:

public DerivedClass(string propA, int propB, IEnumerable<SomeClass> propC) 
     : base(propA, propB, propC) 
{ 
} 
Смежные вопросы