0

myFunc()抽象宣言されている親クラス内で宣言および呼び出されたコードに変更を加えています。そして、それは実際に派生クラスに実装されていますか? 部分クラスには、定義を複数のファイルに分割できるこのプロパティがあることを知っていますが、クラス A と B は異なる名前空間にあり、どちらもキーワード " partial" を使用しません。

このコードは正しく実装されていますか? それとも、C# 言語の規則に違反していますか?

File1.cs

namespace PQR
{
    public abstract class A : UserControl
    {
       protected abstract void myFunc(); //no definition because it is declared abstract
    }

    protected void use_myFunc(int i)
    {
        //call myFunc(). called in a parent class, 
        //where it is declared abstract. And  
        //it is actually implemented in the derived class???
        myfunc();
    }
} 

File2.cs

namespace ABC
{
    public partial class B : PQR.A
    {
       protected override void myFunc() 
       {
          //do something.
       }
    }
}
4

3 に答える 3

2

継承クラスと抽象クラスの概念は、部分クラスとは完全に別のものです。

クラスがマークされpartialている場合、そのクラスをコンパイルしようとすると、すべてのコードファイルを調べて、同じ名前空間、同じクラス名を持ち、もマークされているプロジェクト内の別のクラスを探しますpartial。次に、それらの定義のコードを1つの単一のクラス定義に結合します。最終的な結果は、各部分クラスから1つのクラスにテキストをコピー/貼り付けした場合とほぼ同じです。

実際には、部分クラスの複数のインスタンスを持つ必要はありません。クラスaをマークし、partial追加の部分的な実装を提供しない場合、それは問題ありません。コンパイラエラーにはなりません。そのクラスが存在しない場合と同じように、そのクラスをそのクラスの定義全体としてコンパイルしますpartial

継承はその概念から完全に分離されています。クラスがabstractそれ自身の型にコンパイルされるものとしてマークされている場合、その型の定義はコンパイルされたアセンブリに(そのすべての実装とは別に)存在します。

クラスから継承する場合(抽象的であるかどうかに関係なく)、コンパイル時にクラスを「結合」しません。それらは、コンパイルされたコードに存在する別個のタイプのままです。タイプごとに、そのタイプのすべてのメソッドとその定義がリストされている独自のテーブルがあります。派生型の新しいメソッドごとに、新しい型のその定義を指します。基本クラスから継承され、オーバーライドされていないメソッドの場合、基本クラスを参照します。基本クラスで定義されているが、派生クラスでオーバーライドされている仮想メソッドの場合、派生クラスを指します。これを使用すると、常に各メソッドの実際の実装を見つけることができます。これは、実行時にメソッドを呼び出そうとしたときに実行されます。

于 2012-11-21T21:29:00.967 に答える
1

これは、継承とポリモーフィズムと呼ばれるものです。

これは、何かをしなければならないことがわかっているときに使用されますが、その「何か」の実装は、実行中のインスタンスのタイプによって異なります。

いかなる規則にも違反していません。実際、このパターンにはTemplate methodという名前さえあります。

于 2012-11-21T21:05:03.847 に答える
0

「protected abstract void myFunc();」の後に余分な「}」がありますが、それ以外は問題ないようです。「部分的」は害はありませんが、役割も果たしません。同じタイプの宣言を異なるファイルに分割する機能を提供しますが、継承の処理方法には影響しません。

于 2012-11-21T21:05:40.590 に答える