Joshua Mee
Joshua Mee

Reputation: 602

Base class containing a generic instance created in derived class?

I'm trying to figure out if this is possible.

I have a class, BaseGameEntity, from this I currently derive NormalDrop and OtherDrop each of which has an instance of a StateMachine< T > where T is NormalDrop and OtherDrop respectively.

From here relevant states can be called that apply to those kinds of drop.

What I want to do is put another layer in, the Drop class, which derives from BaseGameEntity which the other forms of drop then derive from.

Within Drop I want a StateMachine< T > where the "T" becomes NormalDrop or OtherDrop depending on what is using it as its base class.

Is this actually possible?

Upvotes: 1

Views: 103

Answers (1)

Rich O&#39;Kelly
Rich O&#39;Kelly

Reputation: 41767

Yes, you can use the curiously recurring template pattern:

public class Drop<T> where T : Drop<T> { ... }
public class NormalDrop : Drop<NormalDrop> { ... }
public class OtherDrop : Drop<OtherDrop> { ... }

Then within the Drop base class T is always NormalDrop or OtherDrop.

This pattern generally isn't considered developer friendly as upon first glance it is confusing and there are probably better ways to structure code (though possibly not always). Eric Lippert wrote a very good blog post about this pattern and some of its shortcomings here.

Upvotes: 1

Related Questions