c# - 适用于预先存在的类层次结构的函数的最佳模式

标签 c# c++ design-patterns language-agnostic hierarchical-data

我有一个现有的类层次结构,我无法修改

即系统发育树:

base
├── animal
│   ├── invertebrate
│   └── vertebrate
│       ├── amphibian
│       ├── bird
│       ├── fish
│       ├── mammal
│       └── reptile
└── plant

我需要为该层次结构中的对象构建一个函数库,即打印函数:

print_mammal_A()
print_mammal_B()
print_fish_A()
print_vertebrate_A()
print_vertebrate_B()
print_animal_A()
  • 这些功能将根据需要进行开发。

  • 每个类可能有多个函数。

显而易见的解决方案是制作一个映射目标层次结构的包装类层次结构。每个包装器实现它自己的功能,即:

class base_wrapper(){
  base * base_ptr;
}

class animal_wrapper : base_wrapper{
  void print_animal_A();
}

class vertebrate_wrapper : animal_wrapper {
  void print_vertebrate_A();
  void print_vertebrate_B();
}

我想知道允许以下任一项目的设计模式:

  • 删除包装器继承(这样库开发人员就不需要知道目标类基)

  • 为目标类自动包装最专业的包装器(因此库用户不需要知道目标类基)

我对 C# 或 C++ 解决方案感兴趣。不确定是否存在可以在其中一个而不是另一个中轻松实现的模式。

最佳答案

我假设你不能自己修改库,所以你不能为每个类添加方法?

如果我理解正确,我认为您可以使用扩展方法。在 C# 中,它会是这样的。

public static class FishExtension
{
    public static void Print(this Fish fish)
    {
     // Now you can work with the fish object.
    }
}   

然后 fish 的用户将能够:

Fish fish = new Fish();
fish.Print();

这样就没有额外的层次结构(没有包装器) 扩展类从未直接使用,用户只需导入其命名空间。

请参阅扩展方法(C# 编程指南) https://msdn.microsoft.com/en-us//library/bb383977.aspx

关于c# - 适用于预先存在的类层次结构的函数的最佳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931039/

相关文章:

C# 重写基本泛型方法无法将 T 转换为 T?

c++ - 了解每月第一天功能的代码

windows - 如何安全地使用 UAC 提升进行 IPC?

c++ - 在 C++ 中,如何在没有 dynamic_cast 的情况下将子类实例从一个基类指针转换为另一个?

c++ - 在 Open GL 2.0 和 glm 中创建第一人称相机

javascript - 在消息传递模式架构下与事件一起传递的数据

sql - 空值与特殊的预定义空值

c# - Windows Phone 8 上的二维码扫描

c# - 如何将字符串转换为 XML 格式

c# - 在我的情况下,我如何设置 Silverlight 到 MySQL 的数据管道?