2

我正在尝试使用 C++/CLI 自动实现的属性来显式覆盖接口。特别是,我写过(在 C++/CLI 中)

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

IInterface在 C# 中显式使用,可以编写

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;在标识符之前丢失ObjectC2433virtual数据声明中不允许,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 回答