Не может наследовать от базового класса и определенного интерфейса, используя тот же тип с универсальным ограничением - PullRequest
2 голосов
/ 15 июня 2010

Извините за странный заголовок. Я действительно понятия не имею, как это лучше выразить ...

Я получаю сообщение об ошибке в следующем фрагменте. Я использую класс Dummy везде. Разве компилятор не понимает ограничения, которые я добавил для DummyImplBase? Это ошибка компилятора, так как она работает, если я использую Dummy напрямую, вместо того, чтобы устанавливать его как ограничение?

Ошибка 1 «ConsoleApplication53.DummyImplBase» не реализует элемент интерфейса «ConsoleApplication53.IRequired.RequiredMethod ()». ConsoleApplication53.RequiredBase.RequiredMethod () не может реализовать ConsoleApplication53.IRequired.RequiredMethod (), поскольку у него нет соответствующего возвращаемого типа ConsoleApplication53.Dummy. C: \ Documents and Settings \ simen \ Мои документы \ Visual Studio 2008 \ Projects \ ConsoleApplication53 \ ConsoleApplication53 \ Program.cs 37 27 ConsoleApplication53

public class Dummy
{
}

public interface IRequired<T>
{
    T RequiredMethod();
}

public interface IDummyRequired : IRequired<Dummy>
{
    void OtherMethod();
}

public class RequiredBase<T> : IRequired<T>
{
    public T RequiredMethod()
    {
        return default(T);
    }
}

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired
    where T: Dummy
{
    public void OtherMethod()
    {
    }
}

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Вы можете добавить это в DummyImplBase:

   public Dummy RequiredMethod() { return base.RequiredMethod(); }

РЕДАКТИРОВАТЬ: Или, если вы используете C # 4.0, вы можете изменить определение IRequired следующим образом:

public interface IRequired<out T>

затем удалите IDummyRequired, и вы все равно сможете назначать производные классы IRequired<Dummy> (но не для IDummyRequired).

2-е РЕДАКТИРОВАНИЕ: Ваш исходный код не скомпилирован, потому что T может быть Dummy или классом, производным от Dummy. И реализованный метод

public DummyDerived RequiredMethod() 

не имеет такой же подписи, как

public Dummy RequiredMethod()

, который был объявлен в IDummyDerived.

0 голосов
/ 15 июня 2010

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

public class Dummy
{
}

public interface IRequired<T>
{
    T RequiredMethod();
}

public interface IDummyRequired<T> : IRequired<T>
    where T : Dummy
{
    void OtherMethod();
}

public class RequiredBase<T> : IRequired<T>
{
    public T RequiredMethod()
    {
        return default(T);
    }
}

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired<T>
    where T: Dummy
{
    public void OtherMethod()
    {
    }
}
0 голосов
/ 15 июня 2010

Если вы измените DummyImplBase на:

public abstract class DummyImplBase<T> : RequiredBase<Dummy>, IDummyRequired
        where T : Dummy
{
    public void OtherMethod()
    {
    }
}
...