Types 如何在不实现功能的情况下实施super-trait?

Types 如何在不实现功能的情况下实施super-trait?,types,rust,Types,Rust,我想说“这个特质是超级特质的产物,所以它应该实现它的所有功能” 问题是trait X:Y{}意味着必须实现Y和X。我只想实现X,但要确保所有函数都匹配Y trait GeneralA{ fn get_x()->字符串; } //问题:如果不实现GeneralA,就无法实现'SpecificA:GeneralA',但我只想强制实现特定的实现,不可能实现常规或默认函数。 性状特异性{ fn get_x()->字符串; } 性状特异性{ fn get_x()->字符串; } 结构S1; S1的imp

我想说“这个特质是超级特质的产物,所以它应该实现它的所有功能”

问题是
trait X:Y{}
意味着必须实现
Y
X
。我只想实现
X
,但要确保所有函数都匹配
Y

trait GeneralA{
fn get_x()->字符串;
}
//问题:如果不实现GeneralA,就无法实现'SpecificA:GeneralA',但我只想强制实现特定的实现,不可能实现常规或默认函数。
性状特异性{
fn get_x()->字符串;
}
性状特异性{
fn get_x()->字符串;
}
结构S1;
S1的impl规范{
fn get_x()->字符串{
“SpecificA->get_x.”to_string()
}
}
S1的impl Specific B{
fn get_x()->字符串{
“SpecificB->get_x.”to_string()
}
}
fn main(){
dbg!(::get_x());
dbg!(::get_x());
}
我想在类型系统中描述的内容:

  • 结构可以实现零个或多个
    SpecificX
    traits
  • 结构无法实现
    GeneralA
    特性
  • 所有
    SpecificX
    trait都应该具有
    GeneralA
    trait的所有功能
  • 当转换为trait类型时,如果没有为该结构实现它,则编译器应该出错
问题是Rust希望我实现
GeneralA
SpecificX

如何在类型系统中实现这一点?

如果特征的“通用”版本未实现,而“特定”版本未实现,则它们之间的关系不能是超级特征关系。听起来你想要的是一个泛型特征和一些标记类型来参数化它

trait HasX<T> {
    fn get_x() -> String;
}

struct A {}

impl HasX<A> for S1 {
    fn get_x() -> String {
        "SpecificA->get_x".to_string()
    }
}

struct B {}

impl HasX<B> for S1 {
    fn get_x() -> String {
        "SpecificB->get_x".to_string()
    }
}
trait HasX{
fn get_x()->字符串;
}
结构A{}
S1的impl HasX{
fn get_x()->字符串{
“SpecificA->get_x.”to_string()
}
}
结构B{}
S1的impl HasX{
fn get_x()->字符串{
“SpecificB->get_x.”to_string()
}
}
A
B
永远不需要实例化\–它们的存在只是为了参数化
HasX
。(根据问题的性质,可能已经有一些类型可用于参数化
HasX
;在这种情况下,您不需要创建新的类型。)



作为空
struct
s的替代,您可以使用空
enum
s(如
enum A{}
)来强制它们从不实例化,尽管这牺牲了它们给您的一些灵活性。

如果
GeneralA
的方法与
SpecificA
specific b
相同,为什么不干脆把它们全部排除在外呢?我对这个问题的解释是,根本没有人应该实现
GeneralA
——它只是
SpecificA
specifib
的一个“模板”,它们在语法上应该是相同的(至少部分是相同的)但彼此之间或与
GeneralA
之间没有类型级别关系。这准确吗?@PeterHall因为
SpecificA
specifib
的类型签名应该是相同的,但是实现是不同的(一个父
General
对许多
Specific
子项)@trentcl是的,我希望
GeneralA
成为代码中的一个点,为所有
SpecificX
子级强制执行公共接口。如果它改变了所有的
SpecificX
,也必须改变以匹配它。