我是C#的新手,我不明白为什么我不能这样做。 有人可以提供一个可以达到相同结果的链接或示例。
public interface IEffectEditorControl
{
object[] EffectParameterValues
{
get;
set { isDirty = true; }
}
bool isDirty { get; set; }
IEffect TargetEffect { get; set; }
}
答案 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
的完整属性之间的区别,TargetEffect
是EffectParameterValues
/ 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,或者使用两者的自动属性。
如果您希望混合使用声明和实现,请使用抽象类而不是接口。