【问题标题】:Pass a Parent Class to a method将父类传递给方法
【发布时间】:2021-10-17 11:42:33
【问题描述】:

大家好,我在一个类中有一个方法,它返回一个子类类型的实例:

class Test
{
    public Activos GetActivos(TiposActivo tipoActivo, int idActivo = 0)
    {
        switch (tipoActivo)
        {
            case TiposActivo.Cartera:
                Carteras carteras = new Carteras();
                return carteras;
            case TiposActivo.Clase:
                Clases clases = new Clases();
                return clases;
            case TiposActivo.Instrumento:
                Instrumentos instrumentos = new Instrumentos();
                return instrumentos;
            default:
                throw new Exception();
        }
    }

}

在这里,Carteras、Clases 和 Instrumentos 是父 Activos 的子代。

返回后,我想对对象进行操作,但代码不知道父类的对象是 Son1、Child2 还是 Child3 类型。如何识别我正在操作的类的类型?

【问题讨论】:

  • 你为什么在乎?你应该继续阅读。 多态性,关于_虚拟方法_和C#中的模式匹配
  • 你有一个工厂函数GetActivos 但同时有一个类层次结构。这不会真正起作用。 | 为什么首先你有一个工厂函数也不是很清楚 - 你所做的只是调用构造函数。所以这个函数没有任何意义。
  • 其实那种工厂是有用的。考虑类似于绘图程序的东西(特别是如果组件可以插入。组件提供图标、名称和在类级别标识它们的东西。当用户单击并将图标拖到在绘图表面,您的工厂使用标识符来确定如何创建正确的组件。但是,那时几乎所有其他东西都将依赖于虚拟方法
  • @Flydog57 非常感谢。 Flydog57 我会的。反正我很在意,因为它们不一样,如果方法返回父类,我不知道是什么样的对象。还是我应该知道?
  • @Manuel 问题是,这基本上是 XY 问题的设置。您认为奇怪的“多类型工厂方法”无论如何都是实际问题的解决方案。你应该告诉我们实际的、真正的问题是——这样我们就可以帮助你。这样一来,我们只会冒着浪费时间的风险将您引向错误的道路。

标签: c# inheritance methods


【解决方案1】:

您可以使用GetType 方法:

        Activos act = GetActivos(TiposActivo.Cartera);

        string type = act.GetType().ToString();

或者:(如果 act 是继承自 Carteras 的类,也将返回 true)

        if (act is Carteras car)
        {
            // ...
        }

或者:(仅当 act 的类型为 Carteras 时才会返回 true。如果它是继承自 Carteras 的 Class 则不会)

        if (act.GetType() == typeof(Carteras))
        {
            Carteras car = (Carteras)act;
        }

【讨论】:

  • 你通常会写if (act is Carteras car) { ... }。这要短得多,并且还可以捕捉到行为类型实际上是 Carteras 的子类的情况。
  • 谢谢!我不知道那件事。我在上面添加了它
  • 虽然它有效,但不应滥用它。通常最好改用虚函数。
  • 嗨克里斯蒂安,但这样做我将有 3 个字段来做同样的事情。我正在寻找的只是这三种类型的一个字段,因为实际上它们是相同的
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多