2011-07-10 100 views
1

我有2个接口,同样的方法,C#:接口:2个接口

public interface I1 
    { 
     string GetRandomString(); 
    } 

    public interface I2 
    { 
     string GetRandomString(); 
    } 

,并在一个班,我已经植入两个,

public class ClassA : I1, I2 
    { 

     string I1.GetRandomString() 
     { 
     return "GetReport I1"; 
     } 

     string I2.GetRandomString() 
     { 
      return "GetReport I1"; 
     } 

    } 

现在主要方法我想访问这些接口的方法,但不能

static void Main(string[] args) 
    { 
     var objClassA = new ClassA(); 
     objClassA.GetRandomString(); // not able to do this, comile time error ... 
    } 

我知道,我缺少一些基本的东西OOPS,只是想知道。 任何帮助?

回答

2

如果您有时想要使用一个接口,有时需要使用另一个接口,则可能需要对其中一个接口使用一个接口。如果你控制了类型,并且可以直接使用其中一个接口函数而不是明确的实现,那么这将避免在该类型上进行强制转换的需求。为了避免强制转换任何一种功能,您应该在对象内使用不同的名称。因为在C#中实现anyInterface的任何方法。Boz必须被称为Boz,最好的办法可能是让IFoo.Boz和IBar.Boz的实现只需调用名为FooBoz和BarBoz的公共方法,然后可以直接调用它,而不会出现歧义。

虽然转换为接口对于类来说价格便宜,但对于结构来说它可能很昂贵。这种成本有可能在一些情况下,通过使用静态方法像下面来避免:

 
    public interface AliceFoo { void foo();}; 
    public interface BobFoo { void foo();}; 
    static void do_alice_foo<T>(ref T it) where T:AliceFoo 
    { 
     it.foo(); 
    } 
    static void do_bob_foo<T>(ref T it) where T : BobFoo 
    { 
     it.foo(); 
    } 

这种方法允许不必强制转换到任何使用,也可以“富”方法。

2

您应该将您的对象转换为特定的接口类型。

static void Main(string[] args) 
{ 
    var objClassA = new ClassA(); 

    I1 objClassAThreatedAsI1Interface = (I1)objClassA; 
    objClassAThreatedAsI1Interface.GetRandomString(); 

    I2 objClassAThreatedAsI2Interface = (I2)objClassA; 
    objClassAThreatedAsI2Interface.GetRandomString(); 
} 
0

将您的两个GetRandomString方法标记为ClassA中的public方法。如果您不提供访问修饰符,则默认为私有。

+2

您不能使用访问修饰符来实现显式接口。对于具有相同签名方法的两个不同接口使用隐式实现是不可能的,否则相同的实现将用于两个接口。 – oxilumin

+0

显式接口声明不能公开。 – mrydengren

4

问题是这些函数不是MyClass的成员函数,因为它们是定义的,而I1.GetRandomString是I2.GetRandomString。你只能叫他们在接口之一:

I1 objClassA = new ClassA(); 
    objClassA.GetRandomString(); 

I2 objClassA = new ClassA(); 
    objClassA.GetRandomString(); 
0

您需要将对象转换为它定义您要调用该方法的版本的界面。

如果您只想在您的类中定义单个版本的方法,请删除接口的显式定义(换句话说,从函数的第一个定义和整个I2。*方法中删除I1。完全)

3

您可以将对象转换为您需要的接口类型,然后调用该方法。

if (objClassA is I1) 
{ 
    ((I1)objClassA).GetRandomString(); 
} 
if (objClassA is I2) 
{ 
    ((I2)objClassA).GetRandomString(); 
} 
1

您已明确实现接口。所以方法实现属于接口,而不是你定义的类型。就编译器而言,该方法对于该类型不存在。

您需要将您的实例明确地转换到您要调用的接口并调用该方法(如其他人所示)。

或者更好的是,选择其中一个接口作为“主”接口并省略显式实现。

public class ClassA : I1, I2 
{ 
    // make I1's implementation the "main" one 
    public string GetRandomString() 
    { 
     return "GetReport I1"; 
    } 

    // I2's implementation could only be called via a reference to an I2 
    string I2.GetRandomString() 
    { 
     return "GetReport I2"; 
    } 

} 

可替换地,只使用一个单一的实施方法(和离开了明确的实施方式)。