2011-12-26 14 views
2

ShapeクラスのToString()メソッドを継承することなく、継承したクラスでそれをオーバーライドする方法はありますか?だから私は文字列メソッドのいずれかを呼び出すたびに、私はオーバーライドされたものを得る?私はこれにしたくないToString()をオーバーライドする

注: Shpae1:形状 オーバーライド....

私はこれを行うためにwan't理由は、私は、すでに私のプロジェクトでは形状の多くを持っています楕円、長方形など(一般的なもの)。私は各形状の位置を印刷したい、私は別の関数にargとして形を取ることができることを知っているが、私は既に形状の文字列を使用するいくつかのコードを持っているので、私はそれがよりエレガントだと思った私は私のコードを変更する必要はないので、私はちょうどtoStringメソッドを変更することができます。

+0

詳細をお知らせください。あなたはShape.ToString()をShapeから継承せずに使いたいですか?もしそうなら、なぜですか? –

+0

OPはWPF固有の質問ではありません。今何? –

+0

@PetarRepac:いいえ。 OPはそれを言っていない。 – SLaks

答えて

2

Shapeのように、既存のクラスを拡張する

主な方法(動的コード生成などを含むいくつかの汚い反射トリックがあるかもしれません)、次のとおりです。

  1. 継承。封印されているRectangleEllipseなどを使用しているため、これはできません。
  2. 部分クラス。 .NETは部分クラスとしてShape,Rectangleなどを提供していないため動作しません。
  3. 延長方法。最も洗練されたソリューションですが、拡張メソッドはクラスがメソッド自体を提供しない場合にのみ使用されるため、どちらも機能しません。 ToString()はすべてのクラスが継承するSystem.Objectに提供されているため、技術的にはShapeRectangleなどはToString()メソッドを持ちます。

だから私は二つの選択肢の一つ検討する:

  • Shapeを受け取り、文字列を返すユーティリティクラスの静的メソッドstring GetStringInfo(Shape s)を作成し、その後、どこでもあなたが上ToString()を使用し、この機能を使用しますShape
  • 誰もが別の作業溶液を知っている場合、私はあまりにも、そのことに興味があると思い、リファクタリングを最小限に抑えるタイプShapeに拡張メソッドstring GetStringInfo()を作成して、代わりにToString()

のこのメソッドを使用するようにコードをリファクタリングします。

+1

+1 - ポイント3.と2番目の箇条書きポイントは、最もエレガントな解決策のようです –

0

いいえ;あなたはそれをすることはできません。

代わりに、おそらくDataTemplateを使用する必要があります。

+0

OPがWPFタグを削除したようです。 –

+0

@PetarRepac:実際には、質問には関係がなかったので、私はしました。私はそれを戻すべきだと思いますか? – SLaks

+0

私はSlaksesの答えはWPFのコンテキストであると思います。 –

0

いつでもクラスの内部フィールドとして、そしてToString()メソッドの_shape.ToString()を呼び出すことができます。私はこれが可能であるとは思わない

+0

Shapeを継承し、ToString()をオーバーライドするのと同じです –

+1

いいえ、そうではありません。 Shapeから継承する場合、クラスはShapeのすべてのパブリックメンバーを公開します。そして、あなたはそれらを隠すことはできません。クラス内にShapeインスタンスが含まれている場合は、クラスのクライアントがアクセスできるメンバーを選択できます。例えば。 ShapeがDraw()メソッドを持つ場合、クラスはこのメソッドを隠すことができます。 –

+0

これはコントロールです。コントロールを継承するのではなく、むしろプライベートフィールドとして保つことが良い習慣だと思いますか? –

関連する問題