我很想知道爲什麼我的接口在抽象基類中的實現不滿足子類中的需求。下面是一個例子:C#協方差和繼承
public interface IBase { }
public interface IConcrete : IBase { }
public interface IBaseManager<out T>
where T : IBase
{
T Create();
IEnumerable<T> SelectAll();
}
public interface IConcreteManager : IBaseManager<IConcrete> { }
public abstract class Base : IBase { }
public class Concrete1 : Base, IConcrete { }
public abstract class BaseManager<T> : IBaseManager<T> where T : class, IBase
{
#region IBaseManager<T> Members
public T Create()
{
throw new NotImplementedException();
}
public IEnumerable<T> SelectAll()
{
throw new NotImplementedException();
}
#endregion
}
public class ConcreteManager : BaseManager<Concrete>, IConcereteManager
{
//error occurs here
}
這是正在產生的誤差:
'ConsoleApplication4.ConcreteManager' 不實現接口成員 'ConsoleApplication4.IBaseManager < ConsoleApplication4.IConcrete> .Create()' 。
'ConsoleApplication4.BaseManager < ConsoleApplication4.Concrete> .Create()' 無法實現 'ConsoleApplication4.IBaseManager < ConsoleApplication4.IConcrete> .Create()',因爲它沒有 'ConsoleApplication4.IConcrete' 的匹配返回類型。
如果我添加這些方法的ConcreteManager
類,一切都很好,編譯器是幸福的。
public new IConcrete Create()
{
return base.Create();
}
public new IEnumerable<IConcrete> SelectAll()
{
return base.SelectAll();
}
如果簡單地返回基類返回的方法就足夠了,爲什麼必須添加方法?爲什麼編譯器不能調用基類中的方法?
我期望擴展接口是問題,請嘗試刪除它。 – 2011-06-09 01:32:41
你不想'公共類ConcreteManager:BaseManager,IConcereteManager'? –
2011-06-09 02:00:26