継承クラスと抽象クラスで述べたように、サブクラスのメソッドと親クラスの間には次の関係があります。
サブクラスは親クラスのメソッドを直接使用します (ただし、親クラスのメソッドは public または protected 型である必要があります)。サブクラスは親クラスのメソッドをオーバーライドします (オーバーライド)。
サブクラスのメソッドは親クラスのメソッドをオーバーライドします。
rree
public class YSchool { private int id = 0; private string name = string.Empty; public int ID { get { return this.id; } } public string Name { get { return name; } } public YSchool() { this.id = 0; this.name = @"清华大学附中"; } public YSchool(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 构造器 /// </summary> public YSchool(int id) { this.id = id; this.name = @"陕师大附中"; } } public class YTeacher { private int id = 0; private string name = string.Empty; private YSchool school = null; private string introDuction = string.Empty; private string imagePath = string.Empty; public int ID { get { return id; } } public string Name { get { return name; } } public YSchool School { get { if (school == null) { school = new YSchool(); } return school; } set { school = value; } } public string IntroDuction { get { return introDuction; } set { introDuction = value; } } public string ImagePath { get { return imagePath; } set { imagePath = value; } } /// <summary> /// 构造器 /// </summary> public YTeacher(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 构造器 /// </summary> public YTeacher(int id, string name, YSchool school) { this.id = id; this.name = name; this.school = school; } /// <summary> /// 给学生讲课的方法 /// </summary> public void ToTeachStudents() { Console.WriteLine(string.Format(@"{0} 老师教育同学们: Good Good Study,Day Day Up!", this.Name)); } /// <summary> /// 惩罚犯错误学生的方法 /// 加virtual关键字,表示该方法可以被覆盖重写 /// </summary> /// <param name="punishmentContent"></param> public virtual void PunishmentStudents(string punishmentContent) { Console.WriteLine(string.Format(@"{0} 的{1} 老师让犯错误的学生 {2}。", this.School.Name, this.name, punishmentContent)); } } public class UniversityTeacher : YTeacher { public UniversityTeacher(int id, string name,YSchool school) : base(id, name, school) { } /// <summary> /// 隐藏父类的同名方法,隐藏后该类只能访问隐藏后的方法,不能访问到父类的该方法了。 /// </summary> public new void ToTeachStudents() { Console.WriteLine(string.Format(@"{0} 老师教育同学们:认真学习.net!", this.Name)); } /// <summary> /// 覆盖 /// </summary> public override void PunishmentStudents(string punishmentContent) { base.PunishmentStudents(punishmentContent);//也可以不执行父类方法。 //自己的代码 } }
親クラスのメソッドを継承し、new を使用して同じメソッドを変更します。親クラスのメソッドと同じ名前と同じパラメータ リストを持つ新しいメソッドを作成するプロセスは、隠蔽と呼ばれます。つまり、サブクラスは親クラスのこのメソッドを隠します。ただし、非表示は上書きとは異なります。非表示メソッドには、そのメソッドが配置されているクラスからのみアクセスできます。親クラスの変数を使用する場合でも、非表示メソッドにはアクセスできます。 上記のコードから、カバーすることと隠すことの違いがわかります。親クラス変数がサブクラス インスタンスを参照した後は、隠しメソッドのみにアクセスできますが、隠しメソッドにはアクセスできません。ただし、オーバーライドされたメソッドにはアクセスできます。
もう 1 つのポイントは、このメソッドをサブクラスによってオーバーライドしたい場合は、親クラスがメソッドに virtual を追加する必要があるということです。親クラスのメソッドを非表示にするために新しいキーワードを追加する必要はありません。 Hide は通常あまり使用されず、特殊な状況でいくつかの問題を解決します。
上記は C# の基礎知識をまとめたものです。基礎知識 (7) メソッドの隠れた内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。