【发布时间】:2019-09-25 23:43:36
【问题描述】:
我最终有一个奇怪的要求。我有来自一个基类的多个派生类,如下所示。
class base
{
}
class derived1 : base
{
}
class derived2 : base
{
}
.
.
.
.
class derivedN : base
{
}
void someFunction(base bObj)
{
//get me derived class object with which bObj was created.
}
现在在我的代码中,我得到了基类对象(这是一个函数的参数)。此函数能否提取出创建此基类对象的确切派生类对象?
这可能没有意义,但我有一种强烈的感觉,一定有办法。
【问题讨论】:
-
if (bObj is derived1 d1) { /* call derived1 methods on d1 */ } else if (bObj is derived2 d2) { /* call derived2 methods on d2 */ } -
我们可以在这里获得更多细节吗?可能你甚至不需要这样做。也许你会。从那个例子很难看出。
-
在很多情况下,您只需给
base一个虚拟方法,然后让每个派生类覆盖该虚拟方法它自己的东西。然后someFunction(base bObj) { bObj.MyVirtualMethod(); }。那么你不需要担心 bObj 指向的确切类型。对象本身知道:如果对象是秘密的derived1,derived1.MyVirtualMethod()会被调用。如果它是secreatelyderived2,那么derived2.MyVirtualMethod()将被调用。 -
@rplusg 这是一个 C#7 习语。如果你被困在旧版本的语言中,你将不得不用“if (a is b) { (a as b).Blah(); }”做一些更笨拙的事情。如果您使用的是 C# 8,则可以使用模式匹配 switch 语句。在 C#9 中,您将能够在 common lisp 和 Ook 的混搭中编写整个内容。在 c#10 中,您将在充满恐惧的反乌托邦景观中养殖外星蜥蜴蛋。
-
我认为 c#10 会在下一次突袭 51 区时派上用场。
标签: c#