我知道接口不允许使用字段。但是为什么实现接口的类不能具有属性/字段。我曾尝试研究这个原因,但无济于事。有人能指出我可以帮助我的资源。
类只能实现从接口继承的方法吗?
这是我的代码:
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指令或汇编引用?)
答案 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);