実装する適切な OO 設計を解読しようとしています。基本的なシナリオは、基本的に常に 0 で始まる 10 桁の電話番号である PstnNumber があることです (例: 0195550000)。先頭の 0 がない場合に数値の自動修正を許可するルールが導入されました (例: 195550000)。
編集開始
元の質問が誤解されている可能性があることに気付きました (すでに回答してくださった方に感謝します)。そのため、シナリオをより適切に説明するために編集しました。
編集終了
私はいくつかの予備的な概念で遊んでみましたが、より適切な方法があるかどうか、またはこれらのいずれかを (あるレベルで) 十分に実行できるかどうかを尋ねると思いましたか?
コンセプト1
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 (削除済み)
コンセプト3
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;
}
}
サブクラスが Number プロパティの動作を変更するため、コンセプト 1 は Liskov Substitution ルールに違反する可能性があると思います (誤解していた場合は幸いです)。
代わりの提案は喜んで受け取られます。