[英]abstract explicit interface implementation in C#
我有这个C#代码:
abstract class MyList : IEnumerable<T>
{
public abstract IEnumerator<T> GetEnumerator();
//abstract IEnumerator IEnumerable.GetEnumerator();
}
就是这样,我得到:
'Type'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'。
删除评论,我得到:
修饰符'abstract'对此项无效
如何制作显式实现摘要
有趣 - 我不确定你能不能。 但是,如果这是你真正的代码,你有没有希望实现非泛型GetEnumerator()
调用通用的一个以任何方式比其他 ?
我这样做:
abstract class MyList<T> : IEnumerable<T>
{
public abstract IEnumerator<T> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
这使您免于必须在每个派生类中实现它的繁琐 - 这无疑都会使用相同的实现。
虽然显式接口成员可能不是抽象(或虚拟),但它可以根据抽象(或虚拟)成员1来实现 :
public abstract class Foo: IEnumerable {
IEnumerator IEnumerable.GetEnumerator() {
return getEnumerator();
}
protected abstract IEnumerator getEnumerator();
}
public class Foo<T>: Foo, IEnumerable<T> {
private IEnumerable<T> ie;
public Foo(IEnumerable<T> ie) {
this.ie = ie;
}
public IEnumerator<T> GetEnumerator() {
return ie.GetEnumerator();
}
protected override IEnumerator getEnumerator() {
return GetEnumerator();
}
//explicit IEnumerable.GetEnumerator() is "inherited"
}
我发现在强类型的ASP.NET MVC 3部分视图中需要这个,它不支持泛型类型定义模型(据我所知)。
实际上,你可以通过强制一个派生自抽象类的类来实现它,并且仍然允许它选择如何实现该接口 - 隐式或显式:
namespace Test
{
public interface IBase<T>
{
void Foo();
}
public abstract class BaseClass<T>
where T : IBase<T> // Forcing T to derive from IBase<T>
{ }
public class Sample : BaseClass<Sample>, IBase<Sample>
{
void IBase<Sample>.Foo() { }
}
class Program
{
static void Main(string[] args)
{
Sample sample = new Sample();
// Error CS1061 'Sample' does not contain a definition for 'Foo'
// and no extension method 'Foo' accepting a first argument of type 'Sample'
// could be found(are you missing a using directive or an assembly reference ?)
sample.Foo();
(sample as IBase<Sample>).Foo(); // No Error
}
}
}
我有一个稍微复杂的情况,我希望一个基类显式实现非泛型接口,派生类实现泛型接口。
接口:
public interface IIdentifiable<TKey> : IIdentifiable
{
TKey Id { get; }
}
public interface IIdentifiable
{
object Id { get; }
}
我通过在基类中声明一个抽象的getter方法并让显式实现调用它来解决它:
public abstract class ModelBase : IIdentifiable
{
object IIdentifiable.Id
{
get { return GetId(); }
}
protected abstract object GetId();
}
public class Product : ModelBase, IIdentifiable<int>
{
public int ProductID { get; set; }
public int Id
{
get { return ProductID; }
}
protected override object GetId()
{
return Id;
}
}
请注意,基类没有可以调用的Id
的类型版本。
似乎不可能做一个抽象的显式接口实现,但你可以做一个解决方法来摆脱错误,但仍然强制使用隐式的显式接口实现:
abstract class MyList : IEnumerable<T>
{
public virtual IEnumerator<T> GetEnumerator() {
(this as IEnumerable).GetEnumerator();
}
}
但是,正如上述问题的评论所指出:
如果您选择将该成员设置为非抽象,则编译器将允许没有(自己的)实现的子类...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.