ユーザーから提供されたマウスデータに基づいて幾何学的図形を描画する簡単なプログラムがあります。マウスの追跡を処理する 1 つのクラス (マウスの移動履歴を含むリストを取得します) と、Shape という抽象クラスが 1 つあります。このクラスから、Circle、Rectangle などの追加の Shape をいくつか派生させます。それらのすべてが抽象 Draw() 関数をオーバーライドします。
それはすべてうまく機能しますが、ユーザーが目的の形状を手動で切り替えられるようにしたい場合に問題が発生します。私はマウスデータを取得し、どのような形状を描くべきかを知っています. 問題は、どのオブジェクトを作成し、適切なパラメーターをコンストラクターに渡す必要があるかをコードに認識させる方法です。また、この時点で新しい Shape 派生物を追加することもできません。これは明らかに間違っています。
私は明らかに次のようなコードを出したくありません:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
上記のコードは、オープンクローズ原則に明らかに違反しています。問題は、それを乗り越える方法がよくわからないことです。主な問題は、さまざまな Shape にさまざまなパラメーターを持つコンストラクターがあり、これがさらに面倒なことです。
これはよくある問題だと確信していますが、それを乗り越える方法がわかりません。アイデアはありますか?