从接口继承到类的属性

本文关键字:属性 接口 继承 | 更新日期: 2023-09-27 18:06:42

interface IRestrictionUserControl
{
    public GeneralRestriction Foo{ get; protected set; }
}
public partial class RestrictionUserControl : UserControl, IRestrictionUserControl
{
    public RestrictionUserControl(Restriction r)
    {
        InitializeComponent();
        Foo = r;
    }
 }

我得到错误:The name 'Foo' does not exist in the current context。我做错了什么?

注:Restriction继承自GeneralRestriction

从接口继承到类的属性

必须在类中定义Foo的实现,因为接口只定义属性的契约。此外,您必须从接口定义中删除public关键字,因为接口定义的所有方法/属性始终是公共的。

必须在派生类中实现 Foo

public partial class RestrictionUserControl : UserControl, IRestrictionUserControl
{
    public RestrictionUserControl(GeneralRestriction r)
    {
        InitializeComponent();
        Foo = r;
    }
    public GeneralRestriction Foo
    {
        get; protected set;
    }
}
从MSDN

接口只包含方法、委托或事件的签名。方法的实现在实现接口

的类中完成。

还有一点:接口成员不能用访问修饰符定义。所以你必须像这样改变你的接口声明,否则它甚至不会编译。

interface IRestrictionUserControl
{
    public GeneralRestriction Foo{ get; /*protected set;*/ }
}   

RestriccionUserControl = RestrictionUserControl?

我相信你打错了

只能从类继承成员和方法,不能从接口继承。接口是一个模板,它将强制实现类拥有这些东西。

所以如果你的接口有一个公共成员属性,你需要在类中实现它,就像你对方法所做的那样。

当您在接口定义中写入GeneralRestriction Foo{ get; protected set; }时,它的含义与在类定义中不同。

在类中,编译器会生成getter和setter(如果我没记错的话,从c# 2.0开始),但在接口中,你只说你的属性必须有一个公共getter和一个受保护的setter。

所以你必须在派生类中实现它们就像在其他答案中所说的那样,我说的实现是指声明一个getter和setter(你甚至可以从接口复制粘贴代码到你的类中)