Hacker News new | past | comments | ask | show | jobs | submit login

Personally I have yet to find a real-world practical example of a deep hierarchy that felt like an intuitive, natural approach to solving the given problem. I'm not specifically skeptical of their existence, but I do question if maybe the problem with deep hierarchies is addressed by not using them.



Oh I quite agree that in general having a deep inheritance hierarchy is not ideal and that many problems can better be solved with compartmentalization or other approaches. I was asking more in the context of you have a million+ line code base and want to make things less error prone/cleaner without refactoring large chunks of it.


Though this is not the only solution, a visitor pattern seems to match.

I can think of other possibilities; hopefully this sparks some good ideas for you. I'll sketch up how I think the visitor pattern could work, sorry if it's already obvious:

Base class A. Derived classes B, C, and D.

When A::Foo() is called run code from each class, in the order they are initialized.

  class A {
  protected:
    vector<function<void(int)>> visitFoo;
  public:
    void Foo(int bar) {
      for (auto fn : visitFoo) {
        fn(bar);
      }
    }
  };

  class B : public A {
  protected:
    // Do not override Foo in class B, C, or D.
    void FooB(int bar) {
    }
  public:
    B() {
      // visitor pattern
      visitFoo.emplace_back(FooB);
    }
  };
Repeat for C and D.


In D, I just call super.this(var, var) to ensure I'm calling the correct base constructor. And fire off an assert if super(void) gets called because I didn't explicitly write a specialized one.

But I think C++ has what... parameter lists for that?




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: