gpt4 book ai didi

c# - 我不明白为什么在基类中测试可能的接口(interface)是错误的

转载 作者:行者123 更新时间:2023-11-30 22:56:04 25 4
gpt4 key购买 nike

我有一个抽象基类,将在数百个派生类中使用,包括一个额外的抽象类。

至少有 2 个属性(我们称它们为 Purpose 和 Description,都是字符串)将被添加到许多(但不是全部)具体派生类中,因此我创建了接口(interface)(IPurposeful 和 IDescribable)来添加它们需要。到目前为止一切都很好。

我想要一个单一的方法,我可以调用从我的基类派生的所有类,如果它确实是 IDescribable,它将验证和更新 Description 属性,或者如果它不是 IDescribable,则只返回 true。我想要另一种类似的方法来验证/更新 Purpose 属性。

我用基类中的一个方法实现了这一点,看起来像这样:

protected bool CheckDescription(bool modify = false)
{
if (this is IDescribable ele)
{
var newDesc = GetCorrectDescription();

UpdateDescription(newDesc, ele.Description, modify);

return newDesc.Equals(ele.Description);
}
else
{
return true;
}
}

SonarQube 将“这是 IDescribable”检查标记为阻止程序(不良做法),我想知道为什么?我能想到的复制此功能的唯一其他方法是将基本方法更改为:

protected virtual bool CheckDescription(bool modify = false)
{
return true;
}

然后将这个完全相同的方法添加到潜在的数百个派生类中:

protected override bool CheckDescription(bool modify = false)
{
var newDesc = GetCorrectDescription();

UpdateDescription(newDesc, Description, modify);

return newDesc.Equals(Description);
}

现在这似乎是不好的做法。

编辑:更改 is/as 模式以删除冗余

最佳答案

如果您的类可能IDescribable并且可能IPurposeful,那么给它合理的默认值那些可能是空操作的接口(interface)的实现,并允许您的后代类根据需要覆盖这些实现。

不需要类型检查。只需调用可覆盖的方法并遵守它们的结果即可。

如果您的“可选”接口(interface)不允许合理的空操作实现,请重新访问它们的定义。

现在您的基类可以依赖接口(interface),而不是测试它们。


您可能会在此处引入运行时错误 - 但对于需要实现特定接口(interface)但编译时不可检查的基类方法也是如此。

关于c# - 我不明白为什么在基类中测试可能的接口(interface)是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54715700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com