【问题标题】:Calling a method of a class on its base class在其基类上调用类的方法
【发布时间】:2014-06-30 18:38:04
【问题描述】:

我有一个名为 Graphic_obj 的基类。

而且我有很多派生类,例如:Graphic_obj_text、Graphic_obj_img、...

现在我想要一个包含所有我创建的派生对象的列表..

List<Graphic_obj> obj_list=new List<Graphic_obj>();

现在我的问题出现了..

我想遍历我的对象并为每个对象调用一个“导出”函数,但来自派生类本身!

我不想 if/else 或切换派生类的所有类型并强制转换它们..

我会想象这样的事情:

foreach (Graphic_obj obj in obj_list)
{
    (obj as obj.GetType()).export_to_csv();
}

但这不会编译..

我可以这样做:

obj.GetType().GetMethod("export_to_csv").Invoke(obj, null);

但我认为有更好更简单的方法?!

谢谢!

【问题讨论】:

  • 如果您正确地覆盖该方法,则将调用派生方法。分享您的方法实现。

标签: c# casting derived-class base-class


【解决方案1】:

只需将export_to_csv 设为虚拟并在派生类中覆盖它。可以在基类export_to_csv中实现常用功能,派生类可以调用。

class Graphic_obj {
    virtual void export_to_csv(){
        // Do stuff that's common across all classes
    }
}

class Graphic_obj_text : Graphic_obj {
    override void export_to_csv(){
        base.export_to_csv():
        // Do stuff specific to Graphic_obj_text
    }
}

【讨论】:

    【解决方案2】:

    你真正需要的技术叫做多态。您可以在父级中定义一个函数,并相应地在各个子级中提供实现。 HERE 是来自 MSDN 的一个简单示例。

    【讨论】:

    • 这不能回答问题。
    【解决方案3】:

    据我了解,您要求的是虚拟方法,描述为 here;它们的存在正是您所描述的目的。

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2021-05-13
      相关资源
      最近更新 更多