인터페이스의 문제 (다형성) 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에 별도의 수업이 있습니다.
그들은 몇 가지 일반적인 방법이 있습니다. 그리고 자신의 수업과 관련된 몇 가지 방법.
이것에 대한 공장 패턴을 구현하고 싶습니다.
지금 무엇을해야합니까?
해결책 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
}
}
그리고 classb에서 이것의 Vise Vera
다른 팁
다음과 같은 일을 할 수 있는지 묻는 경우 :
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();
}
}
Mohsen 나는 당신의 질문과 정말로 혼란 스럽습니다
myfunca () 또는 myfuncb ()를 호출하려면 자신의 calss와 같은 인스턴스를 만들어야합니다.
ClassA a = new ClassA();
a.FuncA(); //interface member
a.FuncB(); // interface member
a.MyFuncA(); //class A Member
인터페이스의 인스턴스를 만들고 서브 클래스 메소드를 호출하려는 이유를 설명 할 수 없습니다 !!!! 내가 맞아? 아니면 문제를 이해 했습니까?