English 中文(简体)
何时使用实时类型信息?
原标题:When to use run-time type information?
  • 时间:2009-10-05 14:33:04
  •  标签:

如果我有各种分门别类,而且根据这些子类的情况算法,如果算法的行为略有不同,则最常用的面向目标的方法就是使用虚拟方法。

例如,如果子类别为DOM节点,如果算法是插入儿童节点,则算法有所不同,取决于母子的代谢成分(可能有子女)还是多功能文本(可以有笔):因此,<条码>内插入的代谢/编码方法可能在<条码>中成为虚拟(或抽象的)底类别,并在<条码>/code>和子类别中分别实施。

另一种可能性是,给予共同财产,其价值可读:例如,算法可读到<代码>node。 <代码>DomNode基类类别中的 财产;或例如,你可能拥有不同类型的网络包装,共用一个共同包装头,并且可以读到包装头,看它究竟是哪一种包装。

我用了多少时间类型的信息,包括:

  • The is and as keywords in C#
  • Downcasting
  • The Object.GetType method in dot net
  • The typeid operator in C++

当Im加上新的算法,取决于子类的类型时,我倾向于在班级等级中增加新的虚拟方法。

我的问题是,何时使用常年类型的信息而不是虚拟功能?

最佳回答

如果没有其他途径。 虚拟方法总是首选,但有时只能使用。 出现这种情况的原因有多种,但最常见的原因是,你没有希望与你合作或能够改变工作的课堂来源代码。 当你与遗产系统或封闭源商业图书馆合作时,往往发生这种情况。

在NET中,还可能发生这样的情况,即:你必须装上传单的新集会,如花.,而且你通常没有基地班,但不得不使用像 d打一样的东西。

问题回答

在C++中,除其他模糊案件(大多涉及低劣的设计选择)外,RTTI是实施“

这种建筑(“is”和“as”)对于Delphi开发商非常熟悉,因为事件处理者通常将物体降为共同的祖先。 例如,OnClick穿过唯一的争辩:无论物体类型如何,无论物体是TButton、TListBox还是任何其他物体。 如果你想更多地了解这个目标,那么你就必须通过“作为”加以利用,但为了避免一个例外,你可以事先以“是”的方式加以核对。 这种降幅使设计型型的物体和方法具有约束性,而严格分类检查是不可能做到的。 如果用户点击Button或B ListBox,但如果他们为我们提供不同的功能原型,那么不可能把他们捆绑在一起。

更一般而言,物体可称为一种功能,可以证明物体已发生变化。 但是,它预先让目的地知道他“个人”的可能性(过去和现在),但不一定。 它是作为所有物体最普通的祖先(Delphi案中的物体)来做到这一点的。

动态——预测和预测;和大;如果我正确记得,取决于RTTI。 某些模糊的外向接口在物体通过真空点时也可能依赖RTTI(无论出于何种原因,<>>可能发生)。

尽管如此,我已经看到,在10年的C++维修工作中,野生动物有()类。 (Luckily)

如果操作时间检查是科索沃,你可以参考更有效的C#。

Item 3. Specialize Generic Algorithms Using Runtime Type Checking

You can easily reuse generics by simply specifying new type parameters. A new instantiation with new type parameters means a new type having similar functionality.

All this is great, because you write less code. However, sometimes being more generic means not taking advantage of a more specific, but clearly superior, algorithm. The C# language rules take this into account. All it takes is for you to recognize that your algorithm can be more efficient when the type parameters have greater capabilities, and then to write that specific code. Furthermore, creating a second generic type that specifies different constraints doesn t always work. Generic instantiations are based on the compile-time type of an object, and not the runtime type. If you fail to take that into account, you can miss possible efficiencies.

例如,假设你写上了一个类别,对通过电子计算方法表示的系列物项进行反向分类;T>。 为了列举这一数据,你可以将其重新分类,并将物品复制到一个中间收集中,如清单和提纲;T>并列举使用索引检索的收集结果。 但是,如果你最初的电子计算方法有点,那么我就不利用这一方法,而是(不复制中间收集)向中转的物品提供更效的(不复制)。 因此,从根本上说,这是我们能够利用但仍然提供同样行为的特例(打破倒退的顺序)。

但总的来说,你应仔细考虑进行操作时间检查,并确保检查不会违反利茨科夫替代原则。





相关问题
热门标签