C#错误:接口成员无法定义

时间:2014-08-01 09:17:03

标签: c# interface member

我是C#的新手,我不明白为什么我不能这样做。 有人可以提供一个可以达到相同结果的链接或示例。

public interface IEffectEditorControl
{
    object[] EffectParameterValues
    {
        get;
        set { isDirty = true; }
    }
    bool isDirty { get; set; }
    IEffect TargetEffect { get; set; }
}

3 个答案:

答案 0 :(得分:10)

您的编译器是正确的,interface成员确实无法定义。

interface为类定义契约,即必须由类实现的属性和方法列表。它不能包含实际代码,例如示例中的isDirty = true;语句。

换句话说,您应该将其更改为:

// this only lists all the members which a class must implement,
// if it wants to implement the interface and pass compilation 
public interface IEffectEditorControl
{
    object[] EffectParameterValues { get; set; }  // <-- removed the statement
    bool IsDirty { get; set; }
    IEffect TargetEffect { get; set; }
}

然后通过提供必要的代码,让某个class 实现接口:

// whichever code accepts the interface IEffectEditorControl,
// can now accept this concrete implementation (and you can have 
// multiple classes implementing the same interface)
public class EffectEditorControl : IEffectEditorControl
{
    private object[] _effectParameterValues; 
    public object[] EffectParameterValues
    {
        get
        { 
            return _effectParameterValues;
        }
        set
        { 
            _effectParameterValues = value;
            IsDirty = true;
        }
    }

    public bool IsDirty { get; set; }
    public IEffect TargetEffect { get; set; }
}

另外,请注意EffectParameterValues_effectParameterValues / IsDirty的完整属性之间的区别,TargetEffectEffectParameterValues / IsDirty。 {3}}带有私人匿名支持字段。将IsDirty设置为值将执行整个setter块,同时修改支持字段和// setting the EffectParameterValues directly won't // set the IsDirty flag in this case public class EffectEditorControl : IEffectEditorControl { public object[] EffectParameterValues { get; set; } public bool IsDirty { get; set; } public IEffect TargetEffect { get; set; } } 属性。

当你需要你的get / set访问器时,不仅要分配一个值(比如在这个例子中设置public static class IEffectEditorControlExtension { public static void SetParametersAndMarkAsDirty (this IEffectEditorControl obj, object[] value) { obj.EffectParameterValues = value; obj.IsDirty = true; } } ),你需要添加实际的支持字段并自己完成整个逻辑。否则,您可以使用更简单的变体。

扩展方法有时可以执行相同的任务。

或者,如果您确实具有接口的通用功能,则可以使用扩展方法。请注意,这仍然不会向接口添加实际代码,但实质上会创建静态方法,可以方便地在实现该接口的每个类上调用它们。

在这种情况下,您可以让课程“哑”并使其自动实现所有内容:

// this will call the static method above
editor.SetParametersAndMarkAsDirty(parameters);

...然后在界面中添加扩展方法:

EffectParameterValues

...然后记得稍后通过该方法分配参数:

{{1}}

这很可能不是扩展方法的最佳用例(没有什么可以阻止你直接设置{{1}}并弄乱整个事情),但为了完整起见我添加了它。

答案 1 :(得分:0)

接口只是&#34;规则&#34;其他类应该实现,以便以期望的方式工作。

这就是为什么他们没有实施。

答案 2 :(得分:0)

线索在你问题的标题中。 C#中的接口就是一个接口。您只能提供无法提供任何实现的方法和属性声明。

另外在您的示例中除了作为接口之外,您还使用auto属性来获取并为set提供实现。这是不允许的。您需要同时实现get和set,或者使用两者的自动属性。

如果您希望混合使用声明和实现,请使用抽象类而不是接口。