ホームページ  >  記事  >  バックエンド開発  >  C# で new と override を使用して抽象クラスの書き換えを実装する場合の違いの詳細な説明

C# で new と override を使用して抽象クラスの書き換えを実装する場合の違いの詳細な説明

黄舟
黄舟オリジナル
2017-03-06 11:12:051650ブラウズ

この記事では、C# における new と override を使用した抽象クラスの書き換えの違いについての詳細な説明を中心に紹介します。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。

1. 抽象実装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Virtualdemo
{
  class Program
  {
    static void Main(string[] args)
    {//BClass A = new BClass(); 抽象类无法被实例
      Class1 c = new Class1();
      BClass c2 = c;
      c2.MethodA();
      c.MethodA();
      c2.MethodB();
      c.MethodB();
      c2.MethodC();
      c.MethodC();
      Console.ReadKey();
    }
  }
  abstract class BClass  //抽象类无法被实例
  {
    public virtual void MethodA() { Console.WriteLine("BClassA"); }
    public virtual void MethodB() { Console.WriteLine("BClassB"); }
    public virtual void MethodC() { Console.WriteLine("BClassC"); }
  }
  class Class1 : BClass
  {
    public void MethodA() { Console.WriteLine("MethodA"); }//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了
    public override void MethodB() { Console.WriteLine("MethodB"); }
    public override void MethodC() { base.MethodC(); }
  }
}

上の図の結果は次のとおりです:

要約すると、抽象クラスの仮想メソッドを書き換える必要があり、問題は書き換えです。 new と override の違いは何ですか? 2 番目に、new と override の違い:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Virtualdemo
{
  class Program
  {
    static void Main(string[] args)
    {
      Teacher t = new Teacher();
      Student stu = t;
      stu.Exam();
      stu.Say();
      t.Say();
      Console.ReadKey();
    }
  }
  public abstract class Student
  {
    public virtual void Exam()
    {
      Console.WriteLine("学生都要考试");
    }
    public void Say()
    {
      Console.WriteLine("我是学生");
    }
  }
  public class Teacher : Student
  {
    public override void Exam()
    {
      Console.WriteLine("老师不用考试");
    }
    //public override void Say() //报错,提示没有virtual,无法被重写
    //{
    //  Console.WriteLine("我是老师");
    //}
    public new void Say()
    {
      Console.WriteLine("我是老师");
    }
  }
}

結果は次のように表示されます。要約すると:

1. 基本クラスが仮想メソッドを定義していない場合、サブクラスは new のみを使用できますが、オーバーライドはできません

2. 基本クラスが仮想メソッドを定義しているかどうかに関係なく、サブクラスは new

を使用できます。 3. サブクラス new を使用することは書き換えとは呼ばれません。単に、新しく作成されたメソッドが基本クラスのメソッドと同じ名前になるだけです。上記は new を使用する場合の違いの詳細な説明です。 C# で抽象クラスの書き換えを実装するためのオーバーライド。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。