c# - C#.NET 中 liskov 原则的类型参数约束

标签 c# generics constraints liskov-substitution-principle

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

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

   T Clone ();

}

我做错了什么?

以下约束也不起作用:

  1. 其中 T : System.Object
  2. 其中 T : 类

在这种情况下,我如何使用 Liskov 原则来解决这个问题?

P.S.:对不起我的英语,如果我犯了错误。我的母语不是英语。

最佳答案

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

没有约束,你的代码应该可以工作,但你需要同时实现 Clone方法与 IEnumerable 相同/IEnumerable<T> work - .NET 没有协变返回类型。然后您还应该指定您的 Clone方法是隐藏 ICloneable 中的那个:

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

请注意当前 ICloneable接口(interface)有点被弃用了——因为它没有给出克隆深度的指示,所以在大多数情况下它不是很有用。

你真的需要扩展非泛型类型吗?您希望用户既希望使用非通用界面,也希望使用您的通用界面吗?

关于c# - C#.NET 中 liskov 原则的类型参数约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1131011/

相关文章:

swift - 屏幕顶部的 Admob 横幅

wolfram-mathematica - 向 Mathematica 指定额外信息以简化表达式

ios7 - 自动布局 : Distribute views evenly, 中的 Spring 带有约束,在 Xcode 5 中

c# - EnumerateFiles 中的配置 SearchPattern

泛型和多态

c# - 如何在 C# 上更新和显示数据库结果

delphi - 为通用对象列表创建对象

c# - 带有泛型的 Unity3D GetComponent

c# - 带有变音符号的 RenderPage()

c# - 如何将 double 格式化为字符串并仅在必要时显示小数位?