类继承自具有额外属性的接口会导致错误

时间:2014-11-30 02:55:59

标签: c# class properties interface

我知道接口不允许使用字段。但是为什么实现接口的类不能具有属性/字段。我曾尝试研究这个原因,但无济于事。有人能指出我可以帮助我的资源。

类只能实现从接口继承的方法吗?

这是我的代码:

using System;

interface IDog
{
    void Bark();
}

class Dog : IDog
{
    public int numberOfLegs = 24;
    public void Bark()
    {
        Console.WriteLine("Woof!");
    }
}

class Program
{
    static void Main()
    {
        IDog Fido = new Dog();
        Fido.Bark();
        Console.WriteLine("Fido has {0} legs", Fido.numberOfLegs);
    }
}

我收到错误:

'IDog'不包含'numberOfLegs'的定义,并且没有扩展方法'numberOfLegs'可以找到接受类型'IDog'的第一个参数(你是否缺少using指令或汇编引用?)

3 个答案:

答案 0 :(得分:2)

Fido声明为IDog类型。

正如错误清楚地告诉您的那样,您不能使用变量的编译时类型中不存在的成员。

如果要使用派生类型声明的成员,则必须将变量更改为派生类型。

答案 1 :(得分:1)

您的Fido变量引用了Dog个实例,但仍然是IDog类型。

Main()的第一行更改为Dog Fido = new Dog();var Fido = new Dog();

错误的第一部分与此相关 - “IDog”不包含“numberOfLegs”的定义。 关于扩展方法的部分不适用,但在学习扩展方法时会有意义(如果没有)。

答案 2 :(得分:1)

接口不能包含字段,但它们可以具有属性。

因此,要解决IDog没有numberOfLegs字段/属性的问题,您可以将其移至界面:

interface IDog
{
    void Bark();
    int NumberOfLegs {get;}
}

class Dog : IDog
{
    public int NumberOfLegs {get {return 24;}}

    public void Bark()
    {
        Console.WriteLine("Woof!");
    }
}

或者,您可以在代码中使用Dog代替IDog ...

Dog fido = new Dog();
Console.WriteLine("Fido has {0} legs", fido.NumberOfLegs);

甚至将接口强制转换为类,但这将无法创建接口。

IDog fido = new Dog();
Console.WriteLine("Fido has {0} legs", ((Dog)fido).NumberOfLegs);