Проблема в интерфейсах (полиморфизм) C #
-
05-07-2019 - |
Вопрос
у меня есть два класса, которые имеют некоторые общие методы, такие как funcA (), funcB ()
и некоторые методы связаны только с его классом ...
я сделал интерфейс 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();
}
как вы видите в двух предыдущих классах. У меня есть две функции myFuncA () и myFuncB () не являются частью интерфейса. они принадлежат только своему классу.
как я могу вызвать их из основного метода. где я создаю объект TestInterface и инициализирую его с некоторым дочерним классом. ???
<Ч>На самом деле у меня есть отдельные классы в DAL.
у них есть несколько общих методов. и некоторые методы, связанные с их собственным классом.
Я хочу реализовать Factory Pattern на этом. Р>
что мне теперь делать?
Решение 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
}
}
и наоборот в классе B
Другие советы
Если вы спрашиваете, можете ли вы сделать что-то вроде:
public static void Main(string[] a)
{
TestInterface test = new ClassA();
test.myFuncA();
}
ответ - нет. Вы должны были бы бросить это в ClassA сначала. Тот факт, что вы думаете, что вам нужно сделать это, указывает на то, что, возможно, что-то не так с вашим дизайном.
TestInterface test = new ClassA();
test.myFuncA();
(test as ClassB).myFuncB();
Надеюсь, это было то, что вы искали.
Создайте новый интерфейс для ClassA и ClassB, и вам просто нужно привести класс к правильному интерфейсу, чтобы увидеть новые функции.
public class ClassA : TestInterface, TestInterfaceA {
}
Итак, когда вы получите конкретный экземпляр, просто приведите его к TestInterfaceA, чтобы увидеть функции, специфичные для этого класса.
Вы можете привести объект TestInterface, но он отрицает цель полиморфизма ...
public static void main()
{
TestInterface test = new ClassA();
test.funcA();
((ClassA) test).myFuncA();
}
Попробуйте кастинг. Я предполагаю из вопроса, что вы имели в виду что-то вроде этого:
public void simpleMethod(TestInterface variableName) {
if (variableName is ClassA) {
((ClassA)variableName).myFuncA();
}
}
Мохсен, я действительно запутался в твоем вопросе
если вы просто хотите вызвать MyFuncA () или MyFuncB (), вам просто нужно создать экземпляр их собственного запроса, например
ClassA a = new ClassA();
a.FuncA(); //interface member
a.FuncB(); // interface member
a.MyFuncA(); //class A Member
Я не могу понять, почему вы пытаетесь создать экземпляр вашего интерфейса, а затем вызывать методы подкласса !!!! Я прав ? или не понял вашу проблему?