3

独自の効果を画像に適用できるように、Bitmap クラスを拡張しようとしています。このコードを使用すると:

namespace ImageEditor
{
    public class Effects : System.Drawing.Bitmap

    {
        public void toBlackAndWhite()
        {
            System.Drawing.Bitmap image = (Bitmap)this;
            AForge.Imaging.Filters.Grayscale filter = new AForge.Imaging.Filters.Grayscale();
            this = filter.Apply(this);
        }
    }
}

次のエラーが表示されます。

'ImageEditor.Effects': cannot derive from sealed type 'System.Drawing.Bitmap'

これを回避する方法はありますか、それとも単にクラスを拡張することはできませんか?

ありがとう。

4

5 に答える 5

15

封印されているため、ビットマップから派生することはできません。

Bitmapクラスにメソッドを追加する場合は、拡張メソッドを記述します。

// Class containing our Bitmap extension methods.
public static class BitmapExtension
{
    public static void ToBlackAndWhite(this Bitmap bitmap)
    {
        ...
    }
}

次に、次のように使用します。

Bitmap bitmap = ...;
bitmap.ToBlackAndWhite();
于 2009-04-20T04:55:56.653 に答える
3

ユダの答えは+1。

また、元のビットマップを変更するのではなく、フィルターが適用された新しいビットマップを返すことを検討してください。これにより、長期的にはアプリにより多くのオプションが提供されます(元に戻すなど)

于 2009-04-20T05:38:42.337 に答える
1

封印されたクラスとは、作成者がクラスから継承できないことを明示的に指示したことを意味します。それを回避する方法は本当にありません。Bitmapクラスに関数を追加する場合は、拡張メソッドを調べることができます。

もちろん、ラッパークラスまたはユーティリティクラスを作成することもできますが、拡張メソッドを使用すると、から継承するような動作が得られますBitmap

于 2009-04-20T04:54:04.097 に答える
1

前の回答は適切です。ここでは拡張メソッドが適切に適用されます。また、最初に考えたのは、継承は最初から良い選択ではないということでした。実際には別の種類のビットマップ (is-a リレーションシップ) を作成するわけではなく、コードをパッケージ化して操作するだけでよいからです。つまり、ビットマップ派生クラスを何かに渡す必要はなく、変更したビットマップを元の代わりに渡すことができます。

Bitmap のメソッドの一部を独自のメソッドでオーバーライドしようとしている場合は、何を達成しようとしているのかをもう一度注意深く調べます。それらに取って代わること。

于 2009-04-20T05:51:57.407 に答える
1

WPF に移行する場合は BitmapSource クラスを拡張でき、toblackandwhite メソッドを追加するのは簡単ですが、WPF を使用してビットマップを読み込む必要があるというペナルティがあります。カスタム BitmapSourceを参照してください。

于 2010-05-24T10:13:30.043 に答える