当前位置: 首页 > 知识库问答 >
问题:

超载前自动浇注接口校正混凝土型式

魏楷
2023-03-14

我有一个由多个具体类实现的接口和一个为每个具体类重载的方法(示例只是为了说明目的):

class IShape 
{
    /* ... */
}
class Square : IShape
{ 
    /* ... */ 
}
class Circle : IShape
{
    /* ... */
}
void toPng(Square a)
{
    /* ... */
}
void toPng(Circle b)
{
    /* ... */
}

下面是我想做的:

/* Here i know that shape is castable to one of the concrete types */ 
Shape shape = Deserialize(jsonString);
toPng(shape) // Error : Cannot convert from 'IShape' to 'Square'

我可以试着对每个具体的类进行强制转换,但感觉不太理想。

try
{ 
    toPng( (Square)shape ) 
}
catch { /* ... */ }
try
{ 
    toPng( (Circle)shape ) 
}
catch { /* ... */ }

有没有一种方法在重载发生之前自动将接口浇铸为正确的混凝土类型? 不知怎么的,我在网上找不到任何东西。

[编辑]我应该注意,在我的情况下,我宁愿不修改接口及其具体实现,因此将topng()放入接口协定中不是我想要的。

共有1个答案

乜昆
2023-03-14

您希望推迟成员查找,直到知道变量的运行时类型。

这就是dynamic的用途。 它在运行时而不是编译时执行成员查找。

/* Here i know that shape is castable to one of the concrete types */ 
dynamic shape = Deserialize(jsonString);
toPng(shape)

尽管您需要注意--您实际上是在断言您知道它会在运行时找到一个合适的成员--如果成员查找实际上失败了,因为shape原来是一个elephant-您将得到一个运行时错误。

 类似资料:
  • 我在一个Java项目中工作,并开始使用Spock框架在Groovy中编写单元测试。但我对Spock的嘲讽功能有意见,希望有人能找出我做错了什么。 然后,我使用Spock在Groovy中编写了以下单元测试: 此测试失败如下: dofoo调用getfoo:21没有可用的foo

  • 问题内容: 有没有一种方法可以自动将Spring bean投射到应用程序上下文XML中定义的类?我想避免将有关Bean的类型信息放在2个地方....在xml配置文件以及代码中作为强制转换。 例如,给定此配置文件 我可以这样调用以避免避免将返回类型直接转换为。我知道我也可以打电话避免强制转换本身,但是我仍然在2个地方输入了类型信息。 看起来Spring可以获取类信息()或从Bean本身获取类型,但是

  • 我这里也有类似的问题 有多重混凝土的Guice……挑其中一个 为Guice提供解决方案。 但是我有一个使用Spring di(bean)的不同项目,但是有同样的问题。 我有一个包含N个混凝土的接口。(此处为3) ........ 然后我有一个班级需要了解所有三个混凝土。 ============= 基本上,我想调用这个方法,传入一个字符串参数,让它为我选择具体的。(如果是我的真实代码,这是通过一个

  • 虽然下面的代码是一个早期的原型,对于我在这个阶段如何实现协议缓冲区不必太认真,但我无法理解rust编译器给我带来的错误消息指的是什么。 src\main。rs:89:9:89:36错误:解决的类型不匹配

  • 问题内容: 我正处于起步阶段,想全神贯注于Go。目前,我正在模拟一个API请求,该请求返回一个包含对象数组的JSON格式的字符串。我正在尝试找出最合适的方法来遍历每个记录并访问每个字段。最终,每个字段都将被写入Excel电子表格,但是现在我只想打印每个字段的键和值。 这就是我所拥有的(我会在Go Playground中提供它,但不支持HTTP请求): 一切工作正常,直到尝试循环访问包含每个记录的属

  • 我有一个问题与生命周期参数的结构。我不能100%确定如何描述这个问题,但是我创建了一个显示编译时错误的简单案例。 我得到的错误是 我尝试了很多变体,只是无法编译这个东西。我在这里找到了另一个帖子(如何修复:预期的具体寿命,但找到了绑定的寿命参数),但似乎绕过了问题,而不是解决它。我真的不明白为什么这个问题会出现。该 有什么想法吗?谢谢你的帮助。

  • 问题内容: 我有一个接口IMenuItem 然后我有一个接口实现 有什么方法可以仅使用IMenuItem接口从配置类创建MenuItem的多个实例?与@autowired之类的?还可以通过指定构造函数的参数来自动装配吗? 问题答案: 实际上适合这种情况。你可以自动连接特定的类(实现)或使用接口。 考虑以下示例: 现在,你可以根据注释值选择对象的名称,从而选择使用其中一种实现方式 像这样: 要多次创

  • 问题内容: 假设我有此接口A: 因此,我希望某些抽象类实现doThis()方法,而不是doThat()一个方法: 当您最终决定在常规类中实现de doThat方法时,就会出现错误: 此类导致我前面提到的错误: “类型B不能是C的超级接口;超级接口必须是接口” 现在任何人都可以,如果这种类层次结构有效,还是应该以其他方式进行处理? 问题答案: 您必须使用 了解和关键字之间的区别很重要。因此,我建议您