参考我自己的类型的最佳方式

2023-12-11

abstract class A<T> where T:A<T>
{
    public event Action<T> Event1;
}

class B : A<B>
{
    //has a field called Action<B> Event1;
}

有没有更优雅的方法来做到这一点?我希望基类中的内容(事件等)能够使用子类的类型。


您使用的模式实际上并没有实现您想要的约束。假设您想要建模“动物只能与同类的动物友好相处”:

abstract class Animal<T> where T : Animal<T>
{
    public abstract void GetFriendly(T t);
}

class Cat : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}

我们是否成功地实现了所需的约束?不。

class EvilDog : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}

现在,邪恶的狗可以与任何猫友好,但与其他邪恶的狗不友好。

您想要的类型约束在 C# 类型系统中是不可能的。如果您需要类型系统强制执行的这种约束,请尝试 Haskell。

有关更多详细信息,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参考我自己的类型的最佳方式 的相关文章

随机推荐

  • MySQL:事务与锁定表

    我对事务与锁定表有点困惑 以确保数据库完整性并确保 SELECT 和 UPDATE 保持同步并且没有其他连接干扰它 我需要 SELECT FROM table WHERE LIMIT 1 if condition passes Update
  • Objective-C:`@synthesize fooBar;` 与`@synthesize fooBar=_fooBar;` [重复]

    这个问题在这里已经有答案了 可能的重复 带下划线前缀的综合属性和变量 这是什么意思 我在代码中见过这两个 有什么不同 synthesize fooBar synthesize fooBar fooBar synthesize fooBar
  • 处理IE浏览器中的ctrl+按键事件

    I m using hotkeys Ctrl key in my flex application getting problem when my app is running in IE when I press Ctrl D im ge
  • 使用 Doctrine 构建通用的 OO ACL

    我正在寻求设计一个以学说为基础的 ACL 系统供我自己使用 尽管我在一些最初的设计考虑因素上遇到了困难 现在我正在考虑根据类和唯一标识符来制作它 并将它们存储在表中 如下所示 Table ACL ResourceClass Resource
  • 子进程打开('source venv/bin/activate'),没有这样的文件?

    我想进入 python 文件中的虚拟环境 但它没有引发这样的文件 import subprocess subprocess Popen source Users XX Desktop mio worker venv bin activate
  • 如何绘制双对数 R 图的线性回归?

    我有以下数据 someFactor 500 x c 1 250 y x 25 someFactor 我以双对数图显示 plot x y log xy 现在我使用线性模型 找出 数据的斜率 model lm log y log x model
  • 如何以编程方式从 Android 删除 SQLite 数据库

    我想从以下位置删除数据库文件Android file system以编程方式 我可以启动 shell 脚本吗adb它又在 Android 空间中运行 shell 脚本来删除数据库 我可以在短时间内完成这件事吗JUnit测试用例 带有syst
  • 哈希表和Trie(前缀树)如何选择?

    因此 如果我必须在哈希表或前缀树之间进行选择 那么导致我选择其中之一的区别因素是什么 从我自己天真的角度来看 使用 trie 似乎有一些额外的开销 因为它不是存储为数组 但就运行时间而言 假设最长的键是最长的英语单词 它本质上可以是 O 1
  • 使用 LightOpenID 登录/注销用户状态

    我正在尝试在我的网站上使用 LightOpenId 来登录 注销用户 这工作正常 但我的问题是 如何跟踪用户登录 注销状态并采取相应的操作 我希望用户仅在登录时访问我的网站功能 并在用户注销时重定向到登录页面 提前致谢 你的问题实际上与Op
  • 创建自定义键盘控件 [Elm]

    我正在尝试为 4 人游戏创建自定义键盘控件 现在 密钥是这样预先确定的 type Orient x Int y Int type GameInput space Bool delta Time so1 Orient so2 Orient s
  • 在 bash 中获取某些列

    假设我有一个数组 其中数组中的每个元素都采用以下格式 someText x1 y1 z1 x2 y2 z2 x3 y2 z3 KEY 构建新数组的方法是什么 其中新数组中的元素只是前一个数组的第一列和最后一列 你可以做这样的事情 其中OLD
  • CloudFormation - 从 Lambda 代码访问参数

    我有一个CloudFormation模板看起来像这样 AWSTemplateFormatVersion 2010 09 09 Description This template will deploy stuff Parameters my
  • 如何使用文件权限保护 Laravel 中的 .env 文件?

    我的 env 文件包含所有凭据 可通过 URL 访问 我发现了一些问题 比如如何在 laravel 5 4 中保护 env 文件 上面说要使用htaccess以防止用户访问该文件 但我更喜欢使用文件权限 所以我将权限更改为0111它只能执行
  • select语句中列的顺序会影响查询速度吗?

    例如 我有一个这样的数据库 id fname lname sex age tel cell address If I do select cell fname address sex而不是做select fname sex cell add
  • getResourceAsStream() 没有看到资源

    我想从我的 jar 文件中解压资源 jar的结构如下 my jar META INF resources my exe my dll my namespace UnpackResourceFromThisClass class 我想从 ja
  • 在响应文本中显示换行符

    我使用 Swagger UI v2 2 0 我有一个返回纯文本的 RESTful 方法 我想用换行符显示此文本 目前 返回的文本包含换行符 但它们显示为 n The Content Type响应头是text plain 我可以返回文本并插入
  • 如何仅使用 php 脚本播放声音文件

    请告诉我如何使用 php 脚本播放声音文件 wav 我需要从数据库获取值 并根据这些值我应该播放声音文件 预先感谢 iam 使用 Linux 操作系统 PHP只是一种处理语言 它cannot为用户播放音频 它can显示将播放 wav 声音的
  • ImageMagick 与 VS2012

    首先非常感谢您阅读我的帖子 我正在尝试使用图像魔术师 with VS2012 on Windows 7 64 位用于图像旋转 这是我所做的 下载图像魔术师对于 Windows 并解压缩它 进入 ImageMagick 6 8 8 Visua
  • ContentFile 未保存在 Django 模型 FileField 中

    我在 Django 模型中将字符串保存为文件时遇到问题 因为每当我尝试取回数据时 它都会给我一个 ValueError 属性没有关联的文件 详细信息如下 MODEL class GeojsonData models Model dname
  • 参考我自己的类型的最佳方式

    abstract class A