问题标签 [type-slicing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
349 浏览

c# - 关于具有许多不同子类的类型切片的设计问题

我经常遇到的一个基本问题,但曾经找到一个干净的解决方案,就是你想要为公共基类或接口的不同对象之间的交互编写行为代码。为了使其更具体,我将举一个例子;

Bob 一直在编写一款支持“酷地理效应”的策略游戏。这些都是简单的限制,例如如果部队在水中行走,他们会减慢 25%。如果他们在草地上行走,他们会减慢 5%,如果他们在人行道上行走,他们会减慢 0%。

现在,管理层告诉鲍勃他们需要新的部队。会有吉普车、船和气垫船。此外,他们希望吉普车在驶入水中时受到伤害,而气垫船将忽略所有三种地形类型。也有传言说他们可能会添加另一种地形类型,其功能比减缓单位减速和受到伤害还要多。

一个非常粗略的伪代码示例如下:

如您所见,如果 Bob 从一开始就有可靠的设计文档,情况会更好。随着单位数量和地形类型的增加,代码的复杂性也在增加。Bob 不仅需要担心确定哪些成员可能需要添加到单元界面,而且他还必须重复大量代码。新的地形类型很可能需要从基本 IUnit 接口获得的附加信息。

每次我们在游戏中添加另一个单位时,都必须更新每个地形以处理新单位。显然,这会导致大量重复,更不用说丑陋的运行时检查,它决定了正在处理的单元的类型。在此示例中,我选择了对特定子类型的调用,但这些调用是必需的。一个例子是,当一艘船撞到陆地时,它的螺旋桨应该被损坏。并非所有单位都有螺旋桨。

我不确定这种问题叫什么,但它是一个多对多的依赖关系,我很难解耦。我不希望 ITerrain 上的每个 IUnit 子类都有 100 个重载,因为我想通过耦合来干净利落。

任何关于这个问题的观点都备受追捧。也许我正在考虑一起脱离轨道?

0 投票
5 回答
8359 浏览

java - Java中的对象切片

您能否获取一个子类对象并以某种方式将其转换为与父类相同类型的对象,同时对所有不属于父类的字段进行切片?

我知道你可以在 C++ 中做到这一点,但我不知道如何在 Java 中做到这一点。

0 投票
4 回答
276 浏览

c++ - c ++在子类和切片中重新定义类型

上面的代码在 clang 3.0 和 g++ 4.5 中编译得很好。但是输出是垃圾(--即,不是三个)。由于编译器似乎不介意,我如何让代码表现出来?

其次,如果有某种方法可以使上述切片/转换正常工作,那么如果我随后执行以下操作会有多糟糕,前提是存在这样做的充分理由:

为什么我对这些语义感兴趣。

我想这样做的原因是这个。我有两个类层次结构,其中一个层次结构(父级)在同一层次结构级别上从另一个(子级)聚合对象。我使用自定义容器进行聚合。我想在父类中对容器进行typedef(typedef同名),并在父类的每一层声明同名的容器。

类层次结构旨在在较低级别包含较少的信息(基类持有的信息最少),因此切片在这里非常有意义。

编辑:

好了,这应该可以解决问题了。

子类 B 的成员比子类 A 多。但是,我不想为只对类 A 的成员感兴趣的代码提供统一的接口。

0 投票
3 回答
101 浏览

python - Python 代码可读性帮助

我想提高我的代码的可读性和格式。我有这段代码,它有效,但我觉得它可能比这更严格,我似乎无法让它以任何其他方式工作。这个想法是读取一个 .txt 文件,查找传入的电子邮件字符串,并按发送小时的频率组织数据。

这是我在文本中寻找的示例行:

来自 email@emailaddress.com 2008 年 1 月 5 日星期六 09:14:16

这是我今天的代码。

0 投票
1 回答
232 浏览

c++ - 在 Visual Studio vs g++ 中将 std::out_of_range 切片为 std::exception

我偶然注意到了以下行为(通过引用错过了捕获),但我找不到如果我事先知道的话,可以让我预测它的信息。

用最小的例子

如果我g++ -std=c++17用 Visual C++ 编译它,我会得到不同的行为。第一个打印d.what() = Out of range exception\nstd::exception,第二个打印d.what() = Out of range exception\nOut of range exception

std::out_of_range原则上,当按值捕获并转换为std::exception类型时,可能会有切片。这意味着我可以期望std::out_of_range在打印对象时不会得到与对象相同的行为what()

问题:我不知道如何解释的部分是两个编译器的不同行为。这是因为这种切片在 C++ 标准化中是未定义的行为,还是这两个编译器之一不符合它?

额外的观察:我只是注意到在这个链接中没有提到这个类std::exception有一个输入 a 的构造函数const char* const &,而在微软网站上它们包括它。我偶然的例子表明他们确实以不同的方式实现了这些类。我的问题仍然是他们是否被允许(如果这种行为是未定义的),或者他们中的一个不遵守,哪一个。