Puoi prima estrarre il / i comportamento / i comune / i in classi semplici che implementano solo IFollow
:
public sealed class FollowTarget : IFollow
{
public Transform Target {get; set;}
public void LateUpdate() { //follow the target }
}
public sealed class FollowSomethingElse : IFollow
{
public Transform Target {get; set;}
public void LateUpdate() { //follow something else }
}
Quindi utilizza l'implementazione richiesta in A
, B
, C
:
public sealed A : Monobehaviour , IFollow {
private readonly IFollow _follow;
public A() => _follow = new FollowTarget();
public Transform Target {get => _follow.Target; set => _follow.Target = value; }
public void LateUpdate() => _follow.LateUpdate();
}
public sealed B : Monobehaviour , IFollow {
private readonly IFollow _follow;
public B() => _follow = new FollowTarget();
public Transform Target {get => _follow.Target; set => _follow.Target = value; }
public void LateUpdate() => _follow.LateUpdate();
}
public sealed C : Monobehaviour , IFollow {
private readonly IFollow _follow;
public C() => _follow = new FollowSomethingElse();
public Transform Target {get => _follow.Target; set => _follow.Target = value; }
public void LateUpdate() => _follow.LateUpdate();
}
Quindi a questo punto potresti vedere che A
/ C
o B
/ C
condividono la stessa implementazione eccetto che non instanziate lo stesso _follow
. In questo caso puoi richiedere un IFollow
nel costruttore e refactor (semplificare) il tuo codice in questo modo:
public sealed AorC : Monobehaviour , IFollow {
private readonly IFollow _follow;
public AorC(IFollow follow) => _follow = follow;
public Transform Target {get => _follow.Target; set => _follow.Target = value; }
public void LateUpdate() => _follow.LateUpdate();
}
public sealed B : Monobehaviour , IFollow {
private readonly IFollow _follow;
public B() => _follow = new FollowTarget();
public Transform Target {get => _follow.Target; set => _follow.Target = value; }
public void LateUpdate() => _follow.LateUpdate();
}
Utilizzo in corso
var a = new AorC(new FollowTarget());
var c = new AorC(new FollowSomethingElse());
Questo approccio è solitamente denominato Decorator ed è una forma specializzata di composizione che promuove un codice più componibile.