【问题标题】:Knowing the original class if casted to an object class如果转换为对象类,则知道原始类
【发布时间】:2014-12-29 06:43:07
【问题描述】:

如果我有两个这样的课程:

public class Animal
{
    public virtual void speak()
    {
        //TOSPEAK
    }
}

public class Dog : Animal
{
    public override void speak()
    {
        //TODOGSPEAK
    }
}  

如果我将这两个类中的任何一个的对象传递给具有类似形式的方法

void method (Animal ob1);

如果我调用 speak 方法,如果我传递每个对象,会调用哪个方法?有没有办法知道哪个对象类型已传递给该方法?

【问题讨论】:

  • @downvoter:虽然拒绝投票是匿名的,但这里的解释肯定会有很长的路要走。你的推理对我来说似乎并不明显。如果它是重复的,请投票关闭或标记。
  • 值得注意的是,测试对象的类型通常表明某处存在设计缺陷;虚方法和多态性的全部意义在于你不必确切地知道你正在处理的对象的类型,只是它实现了一些特定的接口(我在一般意义上,而不是 C# 特性——具有虚方法的基类定义了一个接口)。
  • 不是反对者,但是:作为可维护性问题:您应该避免想知道这个问题的答案:-)。如果你需要对象的类型,你的抽象(这里的 API)是泄漏的。毕竟,显然能够“说话”并不足以与那只动物一起工作。

标签: c# object inheritance casting


【解决方案1】:

如果我调用了 speak 方法,如果我将每个对象传递给一个对象,就会调用该方法

如果您传递给method 的对象只是Animal,则将调用Animal.speak()。如果是狗,会调用Dog.speak()。这就是polymorphism 的全部意义所在。

有没有办法知道哪个对象类型已传递给方法

您可以使用isas 运算符:

if(ob1 is Dog)
{

}

注意:正如大家已经提到的,如果您需要检查对象的类型,那不是一个好主意,您可能应该重新考虑您的设计。如果您想为不同的类型执行不同的操作,那就是重写方法的重点。如果这不是问题,您可以为每种类型创建重载方法,而不是在一个方法中检查类型并实现相同的目标。

【讨论】:

  • 考虑到这个问题的明显范围 - 基本的初学者 OO 设计 - 我真的想强调这是一个坏主意。不要养成使用 isas 运算符的习惯——你错过了多态性。
  • 鉴于“坏主意”已经在这篇文章中提到了 3 次,我想现在每个人都明白了。并非没有,但他们确实将运算符放入了语言中,因此它们很可能一些合理的用例。
猜你喜欢
  • 2011-05-01
  • 2013-01-12
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多