public class Behaviour { Item owner; public Behaviour() { // base class, does nothing. } public void Attach(Item item) { owner = item; } } public class Harvestable : Behaviour() { public Harvestable() { // This is just a base class so it doesn't do anything? } public virtual void Harvest() { // maybe log that the class was not set correctly } } public class HarvestReplace : Harvestable { ItemType replaceType; public HarvestReplace(ItemType replaceWith) { this.replaceType = replaceWith; } public override void Harvest() { owner.Remove(); owner.World.AddItem(replaceType); } } public class ItemType { someVar someProperty; List behaviours; public ItemType(ushort id) { // EXAMPLE if it was a tree, in reality there's a load of different types here. ItemType tree = new ItemType; tree.someProperty = someValue; tree.behaviours = new List(); tree.behaviours.Add(new HarvestReplace(ItemTypes.Log); } } public class Item { World world; someVar someProperty; Harvestable harvestable; public Item(World parent, ItemType type, Vector3 position { // Get all the basics world = parent; this.someProperty = type.property; // now assign behaviours from type // Uh this won't actually work with multiple objects as you're assigning an object reference // I.e: Create TreeA then TreeB and Harvest TreeA, TreeB will get deleted. foreach(Behaviour behaviour in type.behaviours) { behaviour.Attach(this); if(behaviour is Harvestable) { this.harvestable = behaviour; } } } }