アダプタデザインパターンは、クラス(Target)のインターフェイスをクライアントが期待する別のインターフェイス(Adaptee)に変換するために使用されます。アダプタを使用すると、互換性のないクラスを連携させることができます。これは、互換性のないインターフェイスのために他の方法では機能しませんでした。
アダプタパターンは、継承(アダプタパターンのクラスバージョン)とコンポジション(アダプタパターンのオブジェクトバージョン)の2つの方法で実装できます。
私の質問は、継承を使用して実装されるアダプタパターンのクラスバージョンについてです。
図面エディタの例を次に示します。
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
TextViewクラスを再利用してTextShapeを実装したいのですが、インターフェイスが異なるため、TextViewオブジェクトとShapeオブジェクトを同じように使用することはできません。
シェイプインターフェイスに準拠するようにTextViewクラスを変更する必要がありますか?おそらくそうではありません。
TextShapeは、次の2つの方法のいずれかで、TextViewインターフェイスを図形のインターフェイスに適合させることができます。
- ShapeのインターフェースとTextViewの実装(Adapterパターンのクラスバージョン)を継承する
- TextShapeオブジェクト内にTextViewインスタンスを作成し、TextViewインスタンス(アダプタパターンのオブジェクトバージョン)を使用してTextShapeのインターフェイスを実装します。
クラスアダプタ
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
class TextShape : TextView, Shape
{
public Rectangle BoundingBox()
{
Rectangle rectangle;
int x, y;
Point p = GetOrigin();
x = GetWidth();
y = GetHeight();
//...
return rectangle;
}
#region Shape Members
public Rectangle Shape.BoundingBox()
{
return new TextBoundingBox();
}
public Manipulator Shape.CreateManipulator()
{
return new TextManipulator();
}
#endregion
}
さて、質問です:-)。TextShapeはShape、特にTextViewから継承していますか?有効な「isa」関係ですか?そうでなければ、それはリスコフの置換原則に違反しませんか?