1

Ruby では、すべてのクラスが永久にオープンです。新しい動作は、ほぼいつでもどのクラスにも追加できます。VB.NET でこれを行う方法はありますか?

たとえば、既存のアプリ (大規模なアプリ) 内のすべての DataRows に新しい動作を持たせたい場合はどうすればよいでしょうか。DataRow から継承するカスタム行クラスを作成できることはわかっていますが、継承は私が求めているものではありません。すべての場所で行がインスタンス化されていることを確認するために、多くの再作業が必要でした。カスタム行クラスからインスタンス化しています。

これがどのように行われるかについて、2 つの大まかなアイデアがありました。

  1. アスペクト (AOP) がここで機能する可能性があることに気づきました。 既存のメソッドの上に動作を重ねる方法はありますか?

  2. 特定のインターフェイスを既存のクラスに適用することは可能でしょうか。

ここでの主な目標は、既存のコードを大幅に改造する必要がないようにすることです。システムは、これらの階層化された動作/側面に実質的に気付かないようにする必要があります。コードベースへの最小限の変更が必要です。

現在、デコレータ クラスを使用してレイヤード アスペクトを実装しています。問題は、システムがネイティブ行と行デコレータ オブジェクトの違いを認識していることです。システムがネイティブの行であると見なすものを渡すことができるようにしたいと考えています。繰り返しますが、システムは行に適用される装飾を気にする必要はありません。特別なデコレータではなく、行があると考える必要があります。

具体的には、行のデフォルト セット Item(colName) プロパティを装飾して、入力値を変更できるようにしたいと考えています。

4

1 に答える 1

3

あなたが求めていることの多くは、拡張メソッドで可能です。詳細については、ここを参照してください。

http://msdn.microsoft.com/en-us/library/bb384936.aspx

PrintすべてのStringオブジェクトにメソッドを追加するリンクの例を次に示します。

Module StringExtensions
    <Extension()> 
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub
End Module

ただし、拡張メソッドを使用してメソッドを追加することはできますが、プロパティやフィールドは使用できません。また、新しいメソッドまたはオーバーロードのみを追加できます。既存のメソッドを新しいメソッドでオーバーライドすることはできません。

あなたが話しているのは、具体的には、クラスのインデクサー プロパティをオーバーライドする機能であるため、その場合、拡張メソッドは役に立ちません。私が知っている唯一の他のオプションは、プロジェクトをだまして実際のラッパークラスの代わりにラッパークラスを使用させることです。拡張しようとしているライブラリと同じ名前空間に同じ名前の同じクラスを実装する独自のライブラリを作成できます。ラッパー ライブラリは実際のライブラリを参照し、元のクラスからすべてのクラスを継承します。次に、それらを必要なだけ拡張し、他のプロジェクトが実際のライブラリではなくライブラリを参照するだけで済みます。これを行うには、もちろん、多くの名前空間のエイリアシングと、おそらくアセンブリ参照のエイリアシングを使用する必要があります (これは VB.NET では使用できません。externキーワード)。しかし、これはあなたにとって価値がないかもしれないと思います。

于 2012-07-06T18:54:23.440 に答える