试图破译一个合适的面向对象设计来实现。基本情况是您有一个 PstnNumber,它本质上是一个始终以 0 开头的 10 位电话号码(例如 0195550000)。如果缺少前导 0(例如 195550000),则引入了允许自动更正数字的规则。
开始编辑
我意识到最初的问题可能被误解了(感谢那些已经回答过的人),所以我进行了编辑以尝试更好地解释这个场景。
结束编辑
我开始玩一些初步的概念,然后想我会问是否有更合适的方法可以走或做其中一个就足够了(在某种程度上)?
概念一
public class PstnNumber
{
public virtual string Number { get; set; }
public PstnNumber() { }
public PstnNumber(string number)
{
this.Number = number;
}
}
public class AutoFormattedPstnNumber : PstnNumber
{
public override string Number
{
get { return base.Number; }
set { base.Number = value.PadLeft(10, '0'); }
}
public AutoFormattedPstnNumber() : base() { }
public AutoFormattedPstnNumber(string number)
{
this.Number = number;
}
}
概念 2(已删除)
概念三
public class PstnNumber
{
public bool AutoCorrect { get; set; }
private string number;
public virtual string Number
{
get { return (this.AutoCorrect) ? this.number.PadLeft(10, '0') : this.number; }
set { this.number = value; }
}
public PstnNumber() : this(false) { }
public PstnNumber(bool autoCorrect)
{
this.AutoCorrect = autoCorrect;
}
public PstnNumber(string number) : this(false)
{
this.Number = number;
}
public PstnNumber(string number, bool autoCorrect) : this(autoCorrect)
{
this.Number = number;
}
}
我认为概念 1 可能违反 Liskov 替换规则,因为子类改变了 Number 属性的行为(很高兴知道我是否误解了这一点)。
任何替代建议都会很高兴地收到。