2010-05-14 14 views
8

Say, tengo tres interfaces:clase que hereda de varias interfaces que tienen el mismo método de firma

public interface I1 
{ 
    void XYZ(); 
} 
public interface I2 
{ 
    void XYZ(); 
} 
public interface I3 
{ 
    void XYZ(); 
} 

Una clase que hereda de estas tres interfaces:

class ABC: I1,I2, I3 
{ 
     // method definitions 
} 

Preguntas:

  • Si implemento así:

    clase ABC: I1, I2, I3 {

    public void XYZ() 
        { 
         MessageBox.Show("WOW"); 
        } 
    

    }

Compila bien y funciona bien también! ¿Significa que esta implementación de método único es suficiente para heredar las tres interfaces?

  • ¿Cómo puedo poner en práctica el método de todas las tres interfaces y llamarlos? algo como esto:

    ABC abc = new ABC(); 
    abc.XYZ(); // for I1 ? 
    abc.XYZ(); // for I2 ? 
    abc.XYZ(); // for I3 ? 
    

sé que se puede hacer usando la aplicación explícita pero no soy capaz de llamar a ellos. :(

Respuesta

8

Si utiliza la aplicación explícita, entonces usted tiene que enviar el objeto a la interfaz cuyo método al que desea llamar:

class ABC: I1,I2, I3 
{ 
    void I1.XYZ() { /* .... */ } 
    void I2.XYZ() { /* .... */ } 
    void I3.XYZ() { /* .... */ } 
} 

ABC abc = new ABC(); 
((I1) abc).XYZ(); // calls the I1 version 
((I2) abc).XYZ(); // calls the I2 version 
+0

¡Es interesante que esto sea posible en C#! Implementar métodos de interfaz colisionantes por separado en la misma clase es imposible en Java, hasta donde yo sé. –

+1

Es posible, sí, aunque generalmente no lo recomendaría (es confuso). El único lugar en el que creo que es legítimo es cuando se implementan 'ICollection ' y se quiere 'ocultar' la implementación' IEnumerable' no genérica de la definición de clase normal. –

2

Se le puede llamar Usted sólo tiene que utilizar una referencia con el tipo de interfaz:.

I1 abc = new ABC(); 
abc.XYZ(); 

Si usted tiene:

ABC abc = new ABC(); 

que puede hacer:

I1 abcI1 = abc; 
abcI1.XYZ(); 

o:

((I1)abc).XYZ(); 
+0

Quiero llamar a que el objeto de ABC ... ABC ABC ABC = new(); ... – Manish

2

Durante la implementación de una clase no especifique modificador o/w obtendrá error de compilación , también especificar el nombre de la interfaz para evitar ambiguity.You puede probar el código:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleCSharp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass mclass = new MyClass(); 

      IA IAClass = (IA) mclass; 
      IB IBClass = (IB)mclass; 

      string test1 = IAClass.Foo(); 
      string test33 = IBClass.Foo(); 


      int inttest = IAClass.Foo2(); 
      string test2 = IBClass.Foo2(); 


      Console.ReadKey(); 
     } 
    } 
public class MyClass : IA, IB 
{ 
    static MyClass() 
    { 
     Console.WriteLine("Public class having static constructor instantiated."); 
    } 
    string IA.Foo() 
    { 
     Console.WriteLine("IA interface Foo method implemented."); 
     return ""; 
    } 
    string IB.Foo() 
    { 
     Console.WriteLine("IB interface Foo method having different implementation. "); 
     return ""; 
    } 

    int IA.Foo2() 
    { 
     Console.WriteLine("IA-Foo2 which retruns an integer."); 
     return 0; 
    } 

    string IB.Foo2() 
    { 
     Console.WriteLine("IA-Foo2 which retruns an string."); 
     return ""; 
    } 
} 

public interface IA 
{ 
    string Foo(); //same return type 
    int Foo2(); //different return tupe 
} 

public interface IB 
{ 
    string Foo(); 
    string Foo2(); 
} 

}

Cuestiones relacionadas