Trarizon 2023-11-23 16:05:32 好消息是,他们最近在搞 trait 了
Trarizon 2023-11-23 16:06:47 https://github.com/dotnet/csharplang/issues/5497
Trarizon 2023-11-23 16:09:03 不知道要搞多久. Jpg
Trarizon 2023-11-23 16:09:58 我感觉像是 rust 那样
Galium maximowiczii 2023-11-23 16:17:32 Trait
Galium maximowiczii 2023-11-23 16:17:37 是干嘛的来着
Galium maximowiczii 2023-11-23 16:18:36 (开始复习 C++
Trarizon 2023-11-23 16:19:05 c#这个trait比较偏向extension method pro max plus
盐酸 2023-11-23 16:19:07 Trait 不是 C++的东西啊
Trarizon 2023-11-23 16:19:21 起码真的可以这么用(
盐酸 2023-11-23 16:19:32 本来就是 extension method pro max plus 吧
Galium maximowiczii 2023-11-23 16:19:34 那是哪个语言的
盐酸 2023-11-23 16:19:37 Rust
残像之形 2023-11-23 16:19:58 只是 C++的语法正好可以写 traits
盐酸 2023-11-23 16:20:09 不是,这个 trait 不是指 type trait
盐酸 2023-11-23 16:20:19 Rust trait 更像是 C++的 concept
Galium maximowiczii 2023-11-23 16:20:27 能给我讲讲吗
Galium maximowiczii 2023-11-23 16:20:41 完全没学过 Rust
Trarizon 2023-11-23 16:21:00 从 c#上简单说就是你可以为已有class实现你自己定义的interface
残像之形 2023-11-23 16:21:36 https://doc.rust-lang.org/rust-by-example/trait.html
残像之形 2023-11-23 16:21:56 Rust 的 traits 能做到类似 C++的 cpo
盐酸 2023-11-23 16:22:58 C++ CPO 真不行
残像之形 2023-11-23 16:23:05 那确实不行
残像之形 2023-11-23 16:23:17 就应该尽早整语言支持
盐酸 2023-11-23 16:23:21 这种东西没有语言支持纯用 library 写能写,但是用户体验拉到爆
盐酸 2023-11-23 16:24:00 而且 Rust trait 可以语言层面支持类型擦除
Galium maximowiczii 2023-11-23 16:27:48 我看完了那个实例
Galium maximowiczii 2023-11-23 16:28:20 换成 C# 的话感觉确实像 Sheep : IAnimal
Trarizon 2023-11-23 16:28:47 我看很多文章解释 trait:像是接口
残像之形 2023-11-23 16:28:55 这个和接口继承有本质的不同
Trarizon 2023-11-23 16:28:59 然后又讲不清楚哪里不一样
盐酸 2023-11-23 16:30:28 Rust:我们不搞 OOP,我知道这个东西能用来搞 OOP,但是我们这个不是 OOP
Galium maximowiczii 2023-11-23 16:31:32 可是我看了一下用法,真的很像 interface
残像之形 2023-11-23 16:32:02 这种显然比 interface 高级,没有侵入性
Galium maximowiczii 2023-11-23 16:32:41 为什么 interface 有侵入性?
残像之形 2023-11-23 16:33:05 因为用 interface 是一定要写到类定义@
残像之形 2023-11-23 16:33:27 使用者用 traits 可以不改源码下加实现
盐酸 2023-11-23 16:33:39 有侵入性就是,你如果不是类作者你不能给那个类实现某个 trait
盐酸 2023-11-23 16:34:27 问题在于 Rust 的模块设定好像是 trait 或者 struct 必须有一个是你所有的你才能写 impl
盐酸 2023-11-23 16:34:54 就是你作为 C 库的作者不能给 A 库的类实现 B 库的 trait
盐酸 2023-11-23 16:35:12 合理,但是还是得写 wrapper
Galium maximowiczii 2023-11-23 16:36:02 我还是不太懂 interface 的侵入性
残像之形 2023-11-23 16:36:21 就是你得改源码才能实现你想要的 interface
残像之形 2023-11-23 16:36:31 库作者不加就没得用
残像之形 2023-11-23 16:36:45
要么就 @[[nodiscard, deprecated]] consteval Chlorie make_chlorie ()
;
盐酸 2023-11-23 16:37:01 你想给别人的类实现你自己的 interface 你就得给那个类写 wrapper
Galium maximowiczii 2023-11-23 16:37:46 我试着理一下
Galium maximowiczii 2023-11-23 16:39:27 比如说雷亚给 Deemo 整了个 note 的类,现在我想给 note 类实现我自己的 IPianoSoundPlayable 接口,这个是做不到的
盐酸 2023-11-23 16:39:50 Weirdly specific example but ok. Jpg
Galium maximowiczii 2023-11-23 16:40:50 但是如果 Deemo 是 Rust 写的,我就能给 note 类写自己的 PianoSoundPlayable traits 实现
Galium maximowiczii 2023-11-23 16:42:02 Traits 不是拿来 define shared behavior in an abstract way 的吗
盐酸 2023-11-23 16:42:40 @ 基本还是 interface
盐酸 2023-11-23 16:43:04 Interface 不也是 define shared behavior in an abstract way(
盐酸 2023-11-23 16:43:30 属于话术,把一个很浅显的东西说得很高级
Galium maximowiczii 2023-11-23 16:46:38 所以总结:traits 就是个没侵入性的 interface
Trarizon 2023-11-23 16:47:46 Trait 就是 extension method promaxplus+interface promaxplus
Trarizon 2023-11-23 16:47:48 (嗯
残像之形 2023-11-23 17:01:49 Define user customizable behavior in a non-intrusive way 这样应该好点