1

混合アセンブリを作成しようとしています。ここにスニペットがあります:

public ref class OpusStream
: public Stream
{
protected:
    OpusStream(void);

public:
    ~OpusStream(void);
    !OpusStream(void);
    int TestEncode(void);

    /* System::IO::Stream */
    virtual property bool CanRead { bool get(void) override; }
    virtual property bool CanSeek { bool get(void) override; }
    virtual property bool CanWrite { bool get(void) override; }
    virtual property __int64 Length { __int64 get(void) override; }
    virtual property __int64 Position {
        __int64 get(void) override;
        void set(__int64) override;
    }
    virtual void Flush(void) override;
    int Read(Byte[], int, int) override;
    long Seek(long, System::IO::SeekOrigin) override;
    void SetLength(long) override;
    void Write(Byte[], int, int) override;
};

そして、これはコンパイラエラーです:

エラー 11 抽象クラスまたはインターフェイス 'OpusNet.OpusStream' のインスタンスを作成できません C:\Users\benc\Documents\opus-1.1-alpha\OpusTests\MainWindow.xaml.cs 30 21 OpusTests

C++/CLI をやったのは久しぶりです。ここで何を見逃したのか本当にわかりません。

4

2 に答える 2

1

ReadWriteオーバーライドは、(C#のように)間違ったタイプを使用していましたbyte[]

オーバーライドでストリーム上のメソッドを実際にオーバーライドするには、正しいタイプを使用する必要があります。これはoverride、コンパイラがSystem.IO.Streamでメソッドを非表示にしていると通知するまで、省略していじくり回して発見したラウンドアバウトの方法です。

それで;

typedef array<Byte>^ ByteArray;

それで;

virtual __int32 Read(ByteArray, __int32, __int32) override;
于 2013-02-20T10:30:07.433 に答える
0

問題は、これらのプロパティ定義にあります。

virtual property bool CanRead { bool get(void) sealed new; }
virtual property bool CanSeek { bool get(void) sealed new; }

これを として宣言することnewで、基本クラスの抽象メンバーをオーバーライドしていません! 代わりに、基本クラスの抽象メンバーと同じ名前の新しいメンバーをクラスで宣言していますが、抽象メンバーをオーバーライドしていません。

これを実際にメンバーをオーバーライドするように切り替えれば、問題ありません。

virtual property bool CanRead { bool get(void) sealed override; }
virtual property bool CanSeek { bool get(void) sealed override; }
                                                      ^^^^^^^^
于 2013-02-11T17:04:44.050 に答える