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

Read和覆盖使用了错误的Write类型(根据 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 回答