2

C++/CLI 自動実装プロパティを使用して、インターフェイスを明示的にオーバーライドしようとしています。特に、私は (C++/CLI で) 書いています。

interface IInterface
{
    property Object ^MyProperty
    {
        Object ^get(void);
        void set(Object^);
    }
    void Method(void);
}

IInterfaceC# で明示的に使用するには、次のように記述します。

class MyClass : IInterface
{
    Object IInterface.MyProperty { get; set;}
    void IInterface.Method()
    {
    }
}

C++/CLI は EII をサポートしていませんが、明示的なオーバーライドをサポートしています。たとえば、次のように書くことができます

sealed ref class MyClass : IInterface
{
private:
    virtual void method(void) = IInterface::Method {}
public:
    property Object ^MyProperty;
}

自動実装プロパティを使用して明示的なオーバーライドを定義したいのですが、

sealed ref class MyClass : IInterface
{
private:
    virtual void method(void) = IInterface::Method {}
    property Object ^myProperty = IInterface::MyProperty;
}

コンパイラ エラーC2146:;識別子の前にありませんObjectC2433:virtualデータ宣言では許可されていません、C4430: 型指定子がありません、およびC3766: インターフェイス メンバーが実装されていません。何か不足していますか?私が求めるものを達成するための適切な C++/CLI 構文は何ですか?

4

1 に答える 1

1

インターフェイスプロパティを明示的に実装するために、基本的な(つまり、自動実装された)プロパティを別の名前で使用できるとは思いません。ただし、明示的に実装されたプロパティは基本プロパティを参照できます。

interface class IInterface
{
    property Object^ Property
    {
        Object^ get();
        void set(Object^ value);
    }
};

ref class MyClass sealed : IInterface
{
public:
    property String^ MyProperty;
private:
    virtual property Object^ UntypedProperty
    {
        Object^ get() sealed = IInterface::Property::get {
            return MyProperty;
        }

        void set(Object^ value) sealed = IInterface::Property::set {
            MyProperty = value->ToString();
        }
    }
};
于 2015-07-03T19:08:55.627 に答える