首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止ICloneable<T>在C#中的非法继承?

如何防止ICloneable<T>在C#中的非法继承?
EN

Stack Overflow用户
提问于 2018-05-22 02:09:45
回答 1查看 112关注 0票数 2

我有一个接口:

代码语言:javascript
复制
public interface ICloneable<out T>
    where T : ICloneable<T>
{
    T Clone();
}

它应该接收实现此接口的类型(如下所示)。

我可以创建一个实现它的类:

代码语言:javascript
复制
public class Class : ICloneable<Class>
{
    public Class Clone() { return (Class)MemberwiseClone(); }
}

太棒了!

但是任何人都可以创建一个实现ICloneable“错误”的类。

确实存在一种防止继承的方法,如下所示? (2个例子)

代码语言:javascript
复制
public class Other : ICloneable<Class>
{
    public Class Clone() { return new Class(); }
}

代码语言:javascript
复制
public class Other : Class, ICloneable<Class>
{
    public Class Clone() { return (Other)MemberwiseClone(); }
}

并允许继承,如下所示?(2个例子中的任何一个)

代码语言:javascript
复制
public class Other : ICloneable<Other>
{
    public Other Clone() { return (Other)MemberwiseClone(); }
}

代码语言:javascript
复制
public class Other : Class, ICloneable<Other>
{
    public Other Clone() { return (Other)MemberwiseClone(); }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-22 03:05:15

不能重载一个类,所以:

代码语言:javascript
复制
public class Other : Class {}
public class Other : Class, IC<Other> {}

永远不会起作用。

现在,我要拉一个乔恩·斯基特,向你展示你是如何做到的,但又不鼓励你这么做。你可以这样做:

代码语言:javascript
复制
public class CloneableOther : Class, ICloneable<Other> {  }
public class Other : CloneableOther
{

}    

public class CloneableFoo : Class, ICloneable<Foo> { }
public class Foo : CloneableFoo
{

}

此代码所做的是有效地从继承中删除泛型参数。但是,Foo仍然可以这样做:Foo : CloneableFoo, ICloneable<Other>,现在您必须为每个ICloneable实例创建两个类。

这就是为什么你一开始就需要这个?做Foo : IInterface<Foo>是一种实践,但没有办法强制执行它。你最好的选择是复制和粘贴,并确保类匹配。

另一种方法可能是在Class的构造函数中进行检查,查看ICloneable的类型是否是类的类型,如果不是,则抛出异常,如果在运行时执行得足够早,那么排序可能会感觉像是编译时错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50458818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档