4

Shape という基本クラスがあるとします。そして、circle や square などのいくつかのサブクラス。

次に、GetShape という別のクラスにメソッドを作成しましょう。

public Shape GetShape()
{
    return new Circle();  
}

つまり、shapeType を渡して、厳密に型指定された Shape サブクラスを返すことができるということです。上記の例は、実際のコードを大幅に単純化したものですが、要点は合っていると思います。

このメソッドを呼び出すと、次のようになります

var shapeCreator = new ShapeCreator();
Circle myCircle = shapeCreator.GetShape(); 

唯一の問題は、キャストが必要なため、実行すらできないことです。

これは実際に機能します:

Circle myCircle = (Circle) shapeCreator.GetShape(); 

私はそのキャストに夢中ではありません。どうすればそれを回避し、互換性のあるサブクラスを返すことができるように、メソッドが基本クラスを返すようにする方法を達成できますか。

4

5 に答える 5

3

提示された問題を解決する方法はありません。しかし、あなたは言う

つまり、shapeType を渡して、強く型付けされた Shape サブクラスを返すことができるという考えです。

次のような意味ですか。

var shape = shapecreator.GetShape(typeof(Circle));

また

var shape = shapecreator.GetShape<Circle>();

その場合、コンパイル時に型が静的にわかっている場合は、次のようにします。

var circle = shapecreator.GetCircle();

型が静的に認識されておらず、実行時にしか判別できない場合は、どのメソッドを呼び出すかを決定するロジックが必要になります。たとえば、iforswitchステートメントを使用します。そうは言っても、キャストにもそのようなロジックが必要なので、これは実際の欠点ではありません。

ShapeFactoryBaseもう 1 つのオプションは、メソッドを持つクラスと、それを継承してメソッドをオーバーライドするvirtual Shape Create()派生クラスを持つ抽象ファクトリ デザイン パターンを使用することです。ただし、キャストが必要であり、キャストするタイプを決定するロジックが必要です。CircleFactoryCreate()

于 2014-05-30T10:04:42.407 に答える
0

特定のことをしたい場合はCircle、この特定の型にキャストする必要があります。

動的オブジェクトを使用することもできますが、その場合、コンパイル段階で型の安全性チェックが失われます。

于 2014-05-30T10:02:06.123 に答える