Реализация абстрактного метода, который сам является реализацией универсального метода интерфейса - PullRequest
1 голос
/ 09 ноября 2010

Я получаю ошибки компиляции с этой слишком сложной иерархией классов. Интересно, связано ли это с попыткой сделать DeepCopy () со смешанными обобщениями.

public interface IInterface<T>
{
    IInterface<T> DeepCopy();
}

public abstract class AbstractClass<T> : IInterface<T>
{
    public abstract IInterface<T> DeepCopy(); // Compiler requires me to declare this public
}

// Everything good at this point.  There be monsters below

public class ConcreteClass: AbstractClass<SomeOtherClass>
{
    ConcreteClass IInterface<SomeOtherClass>.DeepCopy()
    {
        return new ConcreteClass;
    }
}

Я получаю следующие ошибки компилятора:

'IInterface<...>.DeepCopy()': containing type does not implement interface 'IInterface<SomeOtherClass>'

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Return bool

Изменение ConcreteClass IInterface<SomeOtherClass>.MyMethod()
до bool IInterface<SomeOtherClass>.MyMethod()

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

public override IInterface<SomeOtherClass> DeepCopy()
{
    return new ConcreteClass();
}
2 голосов
/ 09 ноября 2010

Ошибки связаны с тем, что тип возвращаемого значения DeepCopy() не соответствует объявлению в интерфейсе.

Кроме того, у вас другая проблема.Абстрактный класс уже реализует метод из интерфейса, но в конкретном классе вы не реализуете абстрактный метод.Вместо реализации, которую вы сейчас имеете, у вас должна быть следующая реализация:

public override IInterface<SomeOtherClass> DeepCopy()
{
}

Это будет реализовывать абстрактный метод в абстрактном классе, который автоматически реализует метод в интерфейсе.Причина, по которой вам нужно реализовать абстрактный метод в абстрактном классе, заключается в том, что этот класс должен реализовывать интерфейс.Это требование класса.

...