私は、ユーザーから提供されたマウスデータに基づいて幾何学的図形を描く簡単なプログラムを持っています。 私はマウスのトラッキング(マウスの移動履歴を持つリストを取得する)とシェイプと呼ばれる の1つのクラスを処理するクラスを持っています。このクラスからCircle、Rectangleなどの余分なShapesを導き出します。それらのすべてが抽象Draw()関数をオーバーライドします。過去のオープンクローズド原理の取得
すべてうまく動作しますが、ユーザーが希望の形状 を手動で切り替えることができるようにしたいときに問題が発生します。私はマウスのデータを取得し、私はどのような形を描くべきかを知っています。問題は、どのオブジェクトを作成するかを「知る」ようにコードを作成し、適切なパラメータをコンストラクタに渡す方法です。現時点では、形状の派生物を新たに追加することも不可能です。これは間違っています。私はobiouslyのようなコードで出てくるしたくない
:
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.
明確に上記のコードはオープン・クローズ原理をvilates。問題は、私がそれを乗り越えるには良いアイデアがないということです。主な問題は、さまざまな図形 には異なるパラメータを持つコンストラクタがあることです。そのため、はるかに面倒です。
私はこれが一般的な問題だと確信していますが、それをどのように回避するのか分かりません。アイデアはありますか?
これは「オープンクローズド原理」ではありません。それはちょうど多形性です。 –
Shapeのクラスコードを編集用に閉じて拡張機能用に開いてもらいたいので、OCPの問題と一致すると思います。 –
あなたがそれが真実であることを望む限り、それはそうではありません! –