Problema en las interfaces (polimorfismo) C #
-
05-07-2019 - |
Pregunta
tengo dos clases que tienen algunos métodos comunes como funcA (), funcB ()
y algunos métodos solo están relacionados con su clase ...
lo que hice es una interfaz hecha de TestInterface
public interface TestInterface
{
void funcA()
void funcB()
}
public class ClassA : TestInterface
{
public void funcA()
{
Console.WriteLine("This is ClassA FuncA()");
}
public void funcB()
{
Console.WriteLine("This is ClassA FuncB()");
}
public void myFuncA()
{
Console.WriteLine("This is My Own Function A");
}
}
public class ClassB : TestInterface
{
public void funcA()
{
Console.WriteLine("This is ClassB FuncA()");
}
public void funcB()
{
Console.WriteLine("This is ClassB FuncB()");
}
public void myFuncB()
{
Console.WriteLine("This is My Own Function B");
}
}
public static void main()
{
TestInterface test = new ClassA();
test.funcA();
}
como se ve en las dos clases anteriores. Tengo dos funciones myFuncA () y myFuncB () no forman parte de la interfaz. solo pertenecen a su propia clase.
¿Cómo puedo llamarlos desde el método principal? donde estoy creando el objeto de TestInterface e inicializándolo con alguna clase secundaria. ???
en realidad tengo clases separadas en DAL.
tienen algunos métodos comunes. y algunos métodos relacionados con su propia clase.
quiero implementar Factory Pattern en esto.
¿Qué debo hacer ahora?
Solución 7
is it good to add methods of ClassA and ClassB into interface and provide null implementation in other class?
like
public interface TestInterface
{
void funcA();
void funcB();
void myFuncA();
void myFuncB();
}
public class ClassA:TestInterface
{
public void funcA()
{
// some code here
}
public void funcB()
{
// some code here
}
public void myFuncA()
{
// my own code here
}
public void funcB()
{
// null implementation
}
}
y viceversa de esto en la Clase B
Otros consejos
Si está preguntando si puede hacer algo como:
public static void Main(string[] a)
{
TestInterface test = new ClassA();
test.myFuncA();
}
la respuesta es no. Tendría que lanzarlo a la Clase A primero. El hecho de que creas que necesitas hacer esto indica que probablemente hay algo mal con tu diseño.
TestInterface test = new ClassA();
test.myFuncA();
(test as ClassB).myFuncB();
Espero que esto sea lo que estabas buscando.
Cree una nueva interfaz para ClassA y ClassB y solo necesita convertir la clase en la interfaz correcta para ver las nuevas funciones.
public class ClassA : TestInterface, TestInterfaceA {
}
Entonces, cuando tengas la instancia concreta, simplemente envíalo a TestInterfaceA para ver las funciones específicas de esta clase.
Puede lanzar el objeto TestInterface, pero anula el propósito del polimorfismo ...
public static void main()
{
TestInterface test = new ClassA();
test.funcA();
((ClassA) test).myFuncA();
}
Prueba el casting. Asumo por la pregunta que quisiste decir algo como esto:
public void simpleMethod(TestInterface variableName) {
if (variableName is ClassA) {
((ClassA)variableName).myFuncA();
}
}
Mohsen, estoy realmente confundido con tu pregunta
si solo quieres llamar a MyFuncA () o MyFuncB () solo debes crear una instancia de sus propios calss como
ClassA a = new ClassA();
a.FuncA(); //interface member
a.FuncB(); // interface member
a.MyFuncA(); //class A Member
¡No puedo entender por qué estás tratando de crear una instancia de tu interfaz y luego llamar a los métodos de subclase! Estoy en lo cierto? o entendí tu problema?