2014-09-11 3 views
0

я совсем немного поисков, я думал, что я получил право шаблон, но он все еще не компиляции, я бы очень признателен за руку ...C# переопределить абстрактный метод общего типа

У меня есть общий класс :

public abstract class CTopology<TTopology> 
{ 
    protected abstract TTopology Pcalc(); 
    public TTopology PLosses() 
    { do something 
     return this.PCalc() 
    } 

, а затем производный класс

public class CInverter : CTopology<CPBoost> 
    { 
    protected override CPInv PCalc() 
     { 
     CPInv Calc = new CPInv(); 
     do something 
     return Calc; 
     } 
    } 

Теперь я получаю эти 2 компиляции Ошибки:

Ошибка 1 '' iSine46.CInverter не реализуют унаследовали абстрактный член 'iSine46.CTopology.Pcalc()'

Ошибка 2 'iSine46.CInverter.PCalc()': нет подходящего способа нашел переопределить

+0

Visual Studio имеет функцию IntelliSense, которая помогает с этим. В производном классе введите «override PCalc» и нажмите enter. Visual Studio добавит правильный метод или свойство с помощью правых модификаторов. – Grax

ответ

1

причина ошибки заключается в том, что вы должны сохранить подпись метода,:

public abstract class CTopology<TTopology> { 
    // Returns TTopology 
    protected abstract TTopology Pcalc(); 
    ... 
} 

public class CInverter : CTopology<CPBoost> { 
    // Should also return TTopology, that is CPBoost in the case and not CPInv! 
    protected override CPBoost PCalc() { 
    ... 
    } 
    ... 
} 
+0

Я пробовал это, но вместо этого получаю эту ошибку: Ошибка Невозможно найти имя типа или пространства имен «TTopology» (вам не хватает директивы использования или ссылки на сборку?) – ag101

4

переопределение-метод не имеет один и тот же результат типа, как это предусмотрено ваш базовый класс. Вы должны вернуть CPBoost-экземпляр:

public class CInverter : CTopology<CPBoost> { 
    protected override CPBoost PCalc() { ... } 
    ... 
} 
1
public abstract class CTopology<TTopology> 
{ 
    protected abstract TTopology Pcalc(); 
} 


public class CInverter : CTopology<CPBoost> 
{ 
    // note that the return type is of the type you chose for TTopology 
    // and the capitalization is correct 
    protected override CPBoost Pcalc() 
    { 
    return something; 
    } 
} 
0
public class CInverter : CTopology<CPBoost> { 
// You should return TTopology instead of CPInv 
    protected override CPBoost PCalc() { 
    .... 
    } 

} 
Смежные вопросы