Template Method Pattern

OK. Asking the question has stimulated the brain cells. Here goes with a stab at something :

internal protocol InternalMethods
{
  static func beforeExecute(sender: Base)
  
  static func doExecute(sender: Base)
  
  static func afterExecute(sender: Base)
}


public class Base
{
  internal var beforeExecute: ((Base) -> ())?
  
  internal var doExecute: ((Base) -> ())?
  
  internal var afterExecute: ((Base) -> ())?
  
  func execute()
  {
    beforeExecute?(self)
    
    doExecute?(self)
    
    afterExecute?(self)
  }
}


public class Derived : Base, InternalMethods
{
  internal class func beforeExecute(sender: Base)
  {
    print("Derived beforeExecute")
  }
  
  internal class func doExecute(sender: Base)
  {
    
    print("Derived doExecute")
  }
  
  internal class func afterExecute(sender: Base)
  {
    print("Derived afterExecute")
  }
  
  override init()
  {
    super.init()
    
    beforeExecute = type(of: self).beforeExecute
    
    doExecute = type(of: self).doExecute
    
    afterExecute = type(of: self).afterExecute
  }
}


public class FurtherDerived : Derived
{
  override class func beforeExecute(sender: Base)
  {
    super.beforeExecute(sender: sender as! FurtherDerived)
    
    print("FurtherDerived beforeExecute")
  }
  
  override class func doExecute(sender: Base)
  {
    super.doExecute(sender: sender as! FurtherDerived)
    
    print("FurtherDerived doExecute")
  }
  
  override class func afterExecute(sender: Base)
  {
    super.afterExecute(sender: sender as! FurtherDerived)
    
    print("FurtherDerived afterExecute")
  }
}