-3

C# では、抽象クラスで、メソッド 1 の実装とメソッド 2 を抽象として提供します。子クラスで method1 と method2 の両方をオーバーライドできます。次に、抽象メソッドと非抽象メソッドの違いは何ですか。

 abstract class baseclass
    {
        public void nonabstract_method()
        {
            Console.WriteLine("non abstract method in base class with implementation");
        }
        public abstract void abstract_method();//abstract method declaration

    }
    class childClass1: baseclass
    {
        public void nonabstract_method()
        {
            Console.WriteLine("non abstract method in child class 1 with implementation");
        }
        public override void abstract_method()
        {
            Console.WriteLine("abstract method in child class 1 with implementation");
        }
    }
    class childClass2 : baseclass
    {   


        public void nonabstract_method()
        {
            Console.WriteLine("non abstract method in child class 2 with implementation");
        }
        public override void abstract_method()
        {
            Console.WriteLine("abstract method in child class 2 with implementation");
        }
        static void Main(string[] args)
        {

            childClass2 objClass2 = new childClass2();
            objClass2.nonabstract_method();
            objClass2.abstract_method();

            childClass1 objClass1 = new childClass1();
            objClass1.nonabstract_method();
            objClass1.abstract_method();

            Console.ReadLine();
        }

    }
4

2 に答える 2

0

コードで行っていることは、非抽象メソッドと抽象メソッドをオーバーライドすることではなく、単にそれらを隠しているだけです。実際のオーバーライドには、overrideキーワードが含まれている必要があります。

子クラスで method1 と method2 の両方をオーバーライドできます

いいえ。「オーバーライド」は「非表示」を意味すると考えているため、抽象メソッドと非抽象メソッドは同じであると考えています。実際、抽象メソッドはオーバーライドできますが、非抽象メソッドはオーバーライドできません! またはvirtualでマークされたメソッドのみをオーバーライドできますが、すべてのメソッドを非表示にすることができます。overrideabstract

では、何が上書きされ、何が隠されているのでしょうか? 次の 2 つのクラスを検討してください。

public class Hide {
    public void method () {
        Console.WriteLine("Original");
    }
}

public class Override {
    public virtual void method() {
        Console.WriteLine("Original");
    }
}

inheritHideと hide method、 inheritOverrideと overridemethodの場合、2 つのサブクラスは次のようになります。

public class SubHide {
    public void method () {
        Console.WriteLine("Hidden!");
    }
}

public class SubOverride {
    public override void method() {
        Console.WriteLine("Overridden!");
    }
}

これらの 6 つのオブジェクトについて考えてみましょう。それらmethodの が呼び出された場合、何が出力されるのでしょうか?

Hide hide1 = new Hide(); // Original
Hide hide2 = new SubHide(); // Original
SubHide hide3 = new SubHide(); //Hidden!

Override override1 = new Override(); // Original
Override override2 = new SubOverride(); // Overridden!
SubOverride override3 = new SubOverride(); // Overridden!

これで、両者の違いがわかりますか?

また、抽象メソッド自体には実装が含まれていません。正しく機能させるには、実際にオーバーライドする必要があります。抽象クラスには実装されていないメソッドが含まれているため、抽象クラスを直接インスタンス化することはできず、抽象クラスのサブクラスをインスタンス化する必要があります。

結論:抽象メソッドと非抽象メソッドの最大の違いは、抽象メソッドは非表示またはオーバーライドできるが、非抽象メソッドは非表示にしかできないことです。そして、その抽象メソッドには実装がなく、中括弧の空のペアでさえありません。

于 2016-03-02T05:07:24.603 に答える
0

これらのメソッドをオーバーライドしていません。それらを隠しています (コンパイラの警告に注意してください!)。たとえば、テスト コードを次のように変更するとします。

baseclass objClass2 = new childClass2();
objClass2.nonabstract_method();
objClass2.abstract_method();

次の出力が得られます。

実装を持つ基本クラスの非抽象メソッド 実装
を持つ子クラス 2 の抽象メソッド

nonabstract_method()virtualとマークする必要があり、サブクラスはキーワードoverrideを使用し てメソッドを適切にオーバーライドする必要があります。この場合、メソッドには実装がなく、メソッドはオーバーライドされず、サブクラスによって実装されるという事実を除いて、 と のabstract間に違いはありません。non-abstractabstract

于 2016-03-02T04:36:59.437 に答える