2016-06-02 2 views
1

Я хотел бы переопределить общий метод в производном классе. Загвоздка в том, что я хотел бы иметь конкретную реализацию типа параметра, как так:Переопределить общий метод с конкретным типом (параметр типа * скрывает класс *)

namespace Stumped 
{ 
    public class Generic<T> where T : new() 
    { 
     public virtual T Foo() 
     { 
      return new T(); 
     } 

     public virtual TAnother GenericMethod<TAnother>() where TAnother : new() 
     { 
      return new TAnother(); 
     } 
    } 

    public class Concrete : Generic<Inner1> 
    { 
     // Concrete return type. Works as expected. 
     public override Inner1 Foo() 
     { 
      return base.Foo(); 
     } 

     // Why doesn't this make sense? Shows 'Type parameter "Inner2" hides class "Inner2"'. 
     public override Inner2 GenericMethod<Inner2>() 
     { 
      return base.GenericMethod<Inner2>(); 
     } 
    } 

    public class Inner1 { } 

    public class Inner2 { } 
} 

Как уже упоминалось, компилятор говорит мне:

Тип параметра «Внутренний» скрывающую класса «внутренний»

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

Почему это не имеет смысла?

+0

Мой компилятор ничего не отображает. – Valentin

+0

Может быть, переделанная вещь. Тем не менее сообщение действительно. Если бы я попытался получить доступ к свойству Inner2 внутри переопределенного GenericMethod, он говорит мне, что для этого свойства нет определения (потому что, по-видимому, я скрываю класс). – bitbyte

ответ

2

Вы не можете этого сделать вообще.

Переопределение метода не может изменить какую-либо часть интерфейса метода. Поскольку GenericMethod<OtherClass>() действителен для базового класса, он также должен быть действительным для производного класса.

Это называется Liskov substitution principle .

Поскольку компилятор предупреждает вас, вы на самом деле просто объявили параметр нормального типа, который имеет то же имя, что и ваш класс.

+0

Как это отличается от того, как я переопределяю Foo? – bitbyte

+0

@bitbyte: 'Foo' не является общим. – SLaks

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