インターフェイスの問題(多態性)C#
-
05-07-2019 - |
質問
iには、次のような一般的なメソッドを持つ2つのクラスがあります 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();
}
上記の2つのクラスを参照してください。私は2つの関数myFuncA()とmyFuncB()がインターフェースの一部ではありません。それらは自分のクラスにのみ属します。
メインメソッドからそれらを呼び出す方法TestInterfaceのオブジェクトを作成し、子クラスで初期化しています。???
実際、DALには個別のクラスがあります。
これらにはいくつかの一般的な方法があります。および独自のクラスに関連するいくつかのメソッド。
iは、これにファクトリパターンを実装したいです。
今何をすべきですか?
解決 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()を呼び出すだけの場合は、次のような独自のcalsのインスタンスを作成する必要があります
ClassA a = new ClassA();
a.FuncA(); //interface member
a.FuncB(); // interface member
a.MyFuncA(); //class A Member
インターフェイスのインスタンスを作成してからサブクラスメソッドを呼び出そうとしている理由がわかりません!!!! 私は正しいですか?またはあなたの問題を誤解しましたか?