背景
- 处理某项功能在多数子类共用,少数子类禁用。
- 平衡代码量,安全性(误用|拥有他类成员,隐藏他类控件仍会误用),灵活性
客户代码
using static System.Console;
namespace CleanInheritance
{
class Program
{
static readonly string _tiger = "Tiger", _swan = "Swan";
static void Main(string[] args)
{
WriteLine("\nwrong case:");
var tiger = new WrongAnimal(_tiger);
tiger.Eat("deer");
tiger.Run(100);
var wrongSwan = new WrongAnimal(_swan);
wrongSwan.Eat("grass");
wrongSwan.Run(50);
WriteLine("\nright case:");
var rightTiger = new RightAnimal(_tiger);
rightTiger.Eat("deer");
rightTiger.Run(100);
var rightSwan = new RightSwan(_swan);
rightSwan.Eat("grass");
rightSwan.Run(50);
WriteLine("\nbetter case:");
var betterTiger = new Beast(_tiger);
betterTiger.Eat("deer");
betterTiger.Run(100);
var betterSwan = new Bird(_swan);
betterSwan.Eat("grass");
betterSwan.Fly(50);
WriteLine("\nmore case:");
var moreTiger = new MoreBeast(_tiger, new BeastSkill(_tiger));
moreTiger.Eat("deer");
moreTiger.Run(100);
var moreSwan = new MoreBird(_swan, new BirdSkill(_swan));
moreSwan.Eat("grass");
moreSwan.Fly(50);
}
}
}
错误的处理
using static System.Console;
namespace CleanInheritance
{
// 所有方法都归基类,由程序员(人)判断是否应该调用
// 容易误调用,ex. swan.Run()
// 代码量小,安全性差,灵活性差
public class WrongAnimal
{
readonly string _name;
public WrongAnimal(string name) => _name = name;
public void Eat(string something)
=> WriteLine($"- {_name} is eating a/some {something}.");
public void Run(int speed)
=> WriteLine($"- {_name} is running at {speed}km/h.");
}
}
正确的处理
using static System.Console;
namespace CleanInheritance
{
// 所有方法都归基类,但重写方法限制错误调用
// 适用该方法公开
// ex. swan.Run()时忽略|报错
// 代码量中,安全性中,灵活性差
public class RightAnimal
{
protected readonly string _name;
public RightAnimal(string name) => _name = name;
public void Eat(string something)
=> WriteLine($"- {_name} is eating a/some {something}.");
public virtual void Run(int speed)
=> WriteLine($"- {_name} is running at {speed}km/h.");
}
public class RightSwan : RightAnimal
{
public RightSwan(string name) : base(name) { }
// 忽略或报错
public override void Run(int speed)
=> WriteLine($"- {_name} Ingore wrong skill.");
}
}
更佳的处理
using static System.Console;
namespace CleanInheritance
{
// 分配特有方法到子类,净化基类
// 提升专有方法到技能类,并在构造器中传入,可完成更多孙类
// 代码量大,安全性高,灵活性高
public class BetterAnimal
{
protected readonly string _name;
public BetterAnimal(string name) => _name = name;
public void Eat(string something)
=> WriteLine($"- {_name} is eating a/some {something}.");
}
public class Beast : BetterAnimal
{
public Beast(string name) : base(name) { }
public void Run(int speed)
=> WriteLine($"- {_name} is running at {speed}km/h.");
}
public class Bird : BetterAnimal
{
public Bird(string name) : base(name) { }
public void Fly(int speed)
=> WriteLine($"- {_name} is flying at {speed}km/h.");
}
public class MoreBeast : BetterAnimal
{
readonly BeastSkill _skill;
public MoreBeast(string name, BeastSkill skill) : base(name)
=> _skill = skill;
public void Run(int speed) => _skill.Run(speed);
}
public class MoreBird : BetterAnimal
{
readonly BirdSkill _skill;
public MoreBird(string name, BirdSkill skill) : base(name)
=> _skill = skill;
public void Fly(int speed) => _skill.Fly(speed);
}
public class BeastSkill
{
readonly string _name;
public BeastSkill(string name) => _name = name;
public void Run(int speed)
=> WriteLine($"- {_name} is running at {speed}km/h.");
}
public class BirdSkill
{
readonly string _name;
public BirdSkill(string name) => _name = name;
public void Fly(int speed)
=> WriteLine($"- {_name} is flying at {speed}km/h.");
}
}
网友评论