Clearly, we can apply the Strategy Design pattern for the mentioned problem. You can have different strategies like Walk, Run, Swim and change their implementation at runtime with the help of constructor dependency injection.
You can have Animal abstract class, different child class will inherit from the animal class. there will be reference for strategy interface in the animal abstract class.
public abstract class Animal
{
IWalkBehaviour walkBehaviour;
IRunBehaviour runBehaviour;
ISwimBehaviour swimBehaviour;
public Animal() { }
public abstract void LiveLife();
public void performWalk()
{
walkBehaviour.walk();
}
public void performRun()
{
runBehaviour.run();
}
public void performSwim()
{
swimBehaviour.swim();
}
public void SetWalkBehaviour(IWalkBehaviour walk)
{
walkBehaviour = walk;
}
public void SetSwimBehaviour(ISwimBehaviour swim)
{
swimBehaviour = swim;
}
public void SetRunBehaviour(IRunBehaviour run)
{
runBehaviour = run;
}
}
public interface ISwimBehaviour
{
void swim();
}
public class Swim : ISwimBehaviour
{
public void swim()
{
Console.WriteLine("swim");
}
}
public class NoSwim : ISwimBehaviour
{
public void swim()
{
Console.WriteLine("no swim");
}
}
public interface IRunBehaviour
{
void run();
}
public class Run : IRunBehaviour
{
public void run()
{
Console.WriteLine("run");
}
}
public class NoRun : IRunBehaviour
{
public void run()
{
Console.WriteLine("no run");
}
}
public interface IWalkBehaviour
{
void walk();
}
public class Walk : IWalkBehaviour
{
public void walk()
{
Console.WriteLine("walk");
}
}
public class NoWalk : IWalkBehaviour
{
public void walk()
{
Console.WriteLine("no walk");
}
}