接口是否有任何方式可以导致不同的行为?

时间:2012-12-05 20:33:02

标签: c#

说我有以下代码:

class Foo: IFoo {
    public string fooProp { get; set; }
}

interface IFoo {
    string fooProp {get; set; }
}

是否可能存在以下不同的行为:

Foo x = new Foo();
someMethod(x);

IFoo x = new Foo();
someMethod(x);

8 个答案:

答案 0 :(得分:4)

我认为可能有所不同。如果某人使用了糟糕的编程风格,即:

public void someMethod(IFoo f)
{
    if (f is Foo)
    {
        Foo f1 = (Foo)f;
        //Do smth with unique Foo members
    }
    //Do anything with IFoo members
}

答案 1 :(得分:3)

是的,如果someMethodIFooFoo有不同的重载,则会有所不同。

public void someMethod(Foo f)
{
    // Overload 1
}

public void someMethod(IFoo f)
{
    // Overload 2
}

Foo x = new Foo();
someMethod(x); // Matches overload 1
IFoo x = new Foo();
someMethod(x); // Matches overload 2

答案 2 :(得分:1)

(我没有专家)但是在你的第一个场景中,你可以访问Class Foo中的所有内容。在第二种情况下,您只能访问IFoo成员。因此,如果Foo有其他方法(不是界面的一部分),您将能够在第一个场景中访问它们而不是第二个场景。

我认为使用接口名称而不是类名只是封装数据的另一种方式,只提供对接口成员的访问。例如,你可以让Foo和Bar都实现IFoo。您可以将它们添加到List中。

答案 3 :(得分:1)

永远不会有任何区别。

请记住,界面是合同。通过从Foo派生IFoo,您正在实施合同

在这两种情况下,由于Foo IFoo并且遵守合同,因此行为将始终相同。

当然,如何 Foo实现合同是任何人的猜测。但是通过界面的签名也遵守了合同。

答案 4 :(得分:1)

不同的行为可以,但在someMethod内。

说你有

class Foo: IFoo {
    public fooProp { get; set; }
}

interface IFoo {
    fooProp {get; set; }
    myCustomProp {get;set}
}

如果你有

public void someMethod(Foo _foo){
     _foo.myCustomProp; //CAN DO THIS, AS YOUR TYPE IS _FOO_
}

如果方法的参数定义为。

,则无法做到这一点
public void someMethod(IFoo _foo){
     _foo.myCustomProp; //NO SUCH METHOD INFO
}

除非你不投。所以区别在于去除IFoo,去除通用访问参数,但在数据访问方面获得的“潜力”更小,但在体系结构中的类型中获得巨大的潜力。

所以区别仅在于架构和程序工作流程。

答案 5 :(得分:1)

如果你有两个接口,并且每个接口都有一个共同的方法名,那么实现类可以以不同的方式实现相同的方法。它取决于方法的调用方式 - 通过接口与否以及通过哪个接口。

请点击此处查看类似问题:

Inheritance from multiple interfaces with the same method name

答案 6 :(得分:1)

你可以在Foo中有一个显式实现的接口。

class Foo: IFoo {
    private string _fooprop;
    private string _ifooprop;

    public string fooProp       
    {
        get {return "IFoo";}
        set {_fooprop=value;}
    }
    string IFoo.fooProp 
    {
        get {return "Foo";}
        set {_ifooprop=value;}
    }
}

interface IFoo {
    string fooProp {get; set; }
}

有了这个,你将拥有:

IFoo foo1=new Foo();
Foo foo2=new Foo();

Console.WriteLine(foo1.fooProp); // Foo
Console.WriteLine(foo2.fooProp); // iFoo

答案 7 :(得分:0)

如果您明确实施IFoo

,则可以
public class Foo : IFoo
{
    public string Prop
    {
        get { return "Hello Foo"; }
    }

    string IFoo.Prop
    {
        get { return "Hello IFoo"; }
    }
}

public static void SomeMethod<T>(T foo) where T : IFoo
{
    var prop = typeof(T).GetProperty("Prop");
    Console.WriteLine(prop.GetValue(foo));
}