C#.NET 中 liskov 原理的类型参数约束

发布于 2024-07-26 14:40:03 字数 429 浏览 5 评论 0原文

我尝试创建一个继承 System.ICloneable 接口的通用接口,但 Clone() 方法的返回类型是 T。当然,T 类型需要约束以确保它是 System.Object 类的继承,但是以下代码不起作用。

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}

我究竟做错了什么?

另外,以下约束不起作用:

  1. where T : System.Object
  2. where T : class

在这种情况下如何使用里氏原则,即可以缩小返回类型来解决此问题?

PS:如果我犯了错误,请原谅我的英语。 我的母语不是英语。

I try to create a generic interface that inherits the System.ICloneable interface but where the returntype of the Clone()-method is T. Of course the T-type needs constraints to be sure it's an inheritance of the System.Object-class but the following code is not working.

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}

What am I doing wrong?

Also the following constraints don't work:

  1. where T : System.Object
  2. where T : class

how can I use the Liskov-principle in this case that says that you can narrow your return type, to solve this problem?

P.S.: Sorry for my English, if i made mistakes. I'm not a native English speaker.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

记忆里有你的影子 2024-08-02 14:40:39

为什么你需要约束? 一切都继承自 object...

如果没有限制,您的代码应该可以工作,但您需要以与 IEnumerable 相同的方式实现两个 Clone 方法>/IEnumerable 工作 - .NET 没有协变返回类型。 然后,您还应该指定您的 Clone 方法隐藏了 ICloneable 中的方法:

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}

请注意,当前的 ICloneable 接口在某种程度上已被弃用 - 因为它给出了没有表明克隆的深度,在大多数情况下它并不是很有用。

您真的需要扩展非泛型类型吗? 您是否希望用户像使用通用界面一样使用非通用界面?

Why do you need a constraint at all? Everything inherits from object...

Without the constraint your code should work but you'll need to implement both Clone methods in the same way as IEnumerable/IEnumerable<T> work - .NET doesn't have covariant return types. You should also then specify that your Clone method is hiding the one in ICloneable:

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}

Note that the current ICloneable interface is somewhat deprecated - because it gives no indication of the depth of cloning, it's not terribly useful in most cases.

Do you really need to extend the non-generic type at all? Do you expect users to want to use the non-generic interface as well as your generic one?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文