3

实现具有自己的接口成员的接口的正确方法是什么?(我说得对吗?)这就是我的意思:

public Interface IFoo
{
    string Forty { get; set; }
    string Two { get; set; }
}

public Interface IBar
{
    // other stuff...

    IFoo Answer { get; set; }
}

public class Foo : IFoo
{
    public string Forty { get; set; }
    public string Two { get; set; }
}

public class Bar : IBar
{
    // other stuff

    public Foo Answer { get; set; } //why doesnt' this work?
}

我已经使用显式接口实现解决了我的问题,但我想知道是否有更好的方法?

4

4 回答 4

6

您需要使用与界面中完全相同的类型:

public class Bar : IBar 
{ 
    public IFoo Answer { get; set; }   
} 

注意:IFoo而不是Foo.

原因是接口定义了一个契约并且契约说它必须是一个IFoo.

想一想:

你有类FooFoo2,都实现IFoo。根据合同,可以分配两个类的实例。现在,如果你的代码是合法的,这会以某种方式破坏,因为你的类只接受Foo. 显式接口实现不会以任何方式改变这一事实。

于 2012-09-12T15:29:47.747 回答
4

你需要使用泛型才能做你想做的事。

public interface IFoo
{
    string Forty { get; set; }
    string Two { get; set; }
}

public interface IBar<T>
    where T : IFoo
{
    // other stuff...

    T Answer { get; set; }
}

public class Foo : IFoo
{
    public string Forty { get; set; }
    public string Two { get; set; }
}

public class Bar : IBar<Foo>
{
    // other stuff

    public Foo Answer { get; set; }
}

这将允许您提供一个接口,该接口类似于“要实现此接口,您必须具有一个具有实现的类型的公共 getter/setter 的属性IFoo。” 如果没有泛型,您只是说该类具有类型为的属性IFoo,而不是任何实现的属性IFoo

于 2012-09-12T15:35:54.663 回答
0

IBar 有一个 IFoo 字段,而不是 Foo 字段,而是这样做:

public class Bar : IBar
{
    // other stuff

    public IFoo Answer { get; set; }
}
于 2012-09-12T15:30:39.083 回答
0

Foo 可以扩展 IFoo 类型,但这不是接口公开的内容。接口定义了合同,您需要遵守该合同的条款。所以正确的方法是 public IFoo Answer{get;set;}像其他人所说的那样使用。

于 2012-09-12T15:32:45.460 回答