虽然乱了点,凑合看吧: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 面向对象之继承 { /*定义一个父类*/ #region Father Class public class Father { //Define the field private string str = ""; private string dest = "wow"; private int a = 5; protected double num = 0; public char[] dbArr = new char[5]; //Define the property public string Str { get { return str; } set { str = value; } } public string Des { get { return dest; } } public int A { get { return a; } } public double Num { get { return num; } set { num = value; } } public char[] DbArr { get { return dbArr; } set { dbArr = value; } } //Define the method public string Paste() { Console.WriteLine("Enter your words here:"); string a = Console.ReadLine(); Console.WriteLine(a + dest); Console.Read(); return a + dest; } //static方法中,不能使用类中定义的字段和属性,只能重新定义所需变量。 public static void Separate(char[] chArr) { string s = "I'm coming! "; string s1 = "(:WOW:), "; string s2 = s+s1; string[] strArr = new string[20]; strArr = s2.Split(chArr); foreach (string str in strArr) { Console.Write(str); } Console.ReadLine(); } //同样输出的非静态方法 public void SepStr() { Console.WriteLine("Enter your hope here:"); //给可写属性赋值 Str = Console.ReadLine(); Console.WriteLine("Your hope is : {0}", str); //给属性赋值以后,也就给他相应的字段str赋值了。 string wholeLine = dest + str; Console.WriteLine("Enter the sep sign:"); //直接给字段赋值是可以的。 string sep = Console.ReadLine(); dbArr = sep.ToCharArray(); //给字段赋值了以后,相应的属性也就返回了该字段值。 string[] strArr1 = wholeLine.Split(DbArr); foreach (string str1 in strArr1) { Console.Write(str1); } Console.Read(); } //定义一个可重写的递归函数求一个数字的阶乘,虚函数 public virtual int Fact(int n) { //Console.WriteLine("Enter the number you want to roll:"); A = Int32.Parse(Console.ReadLine());无法对A赋值,因为这个属性是只读的。 所以直接对字段赋值 //a = Int32.Parse(Console.ReadLine()); //n = a; if (n <= 1) return 1; else return n * Fact(n - 1); } //接下来,在这同一个类中,定义三个重载的函数 public double HandleNum(double m, double n) { num = m * n; return num; } public void HandleNum(int m, int n) { num = m + n; Console.WriteLine("父类的重载函数1的返回值是:{0}", num); } public static double HandleNum(int m, int n, double l) { double num = (double)(m * n); return num + l; } } #endregion /*定义一个继承于父类的子类,会重写其中的某些方法*/ #region Son Class public class Son : Father { private int sonA = 0; private double sonNum = 0; public int SonA { get { return sonA; } set { sonA = value; } } public double SonNum { get { return sonNum; } } //重写基类方法, 使用for循环而不用递归方法 public override int Fact(int n) { Console.WriteLine("Input your int number you want to fact:"); SonA = Int32.Parse(Console.ReadLine()); n = this.sonA; if (n <= 1) return 1; else { int result = 1; for (int i = n; i > 1; i--) { result *= i; } return result; } } //定义一个派生类独有的方法,该方法中要通过this, base关键字来调用基类方法和派生类的方法 //定义一个internal方法,在同一个工程或者程序集中可以使用。 internal double useNum(double x) { x = this.SonNum + 2.15; double y = base.num + 3; double result = base.HandleNum(x, y); return result; } } #endregion #region using the class class Program { static void Main(string[] args) { //使用基类方法 Father f = new Father(); f.Num = 3.1415926; Console.WriteLine("父类的递归方法的返回值是:{0}",f.Fact(f.A)); Console.WriteLine("父类的字符串粘贴方法的返回值是:" + f.Paste()); Console.WriteLine("下面是使用父类分割字符串的实例方法:"); f.SepStr(); f.HandleNum(2, 3); Console.WriteLine("父类的重载方法2的返回值是:{0}",f.HandleNum(1.234, 2.546)); //使用父类的两个静态方法 Console.WriteLine("父类的重载HandleNum方法的静态方法的输出:{0}",Father.HandleNum(1, 2, 2.123)); Console.WriteLine("下面是使用父类分割字符串的静态方法:"); char[] myChar = { '(', ':', ':', ')' }; Father.Separate(myChar); //使用子类方法 Son s = new Son(); Console.WriteLine("子类递归函数的返回值是: {0}",s.Fact(5)); //使用子类继承自父类的几个重载方法,其中父类的静态方法是不能继承的。 s.HandleNum(2, 3); s.HandleNum(1.234, 2.546); //利用多态,让父类对象使用子类方法 Father f1 = new Father(); Son s1 = new Son(); f1 = s1; Son s2 = (Son)f1; double r = s2.useNum(2.123); Console.WriteLine("使用多态性,父类使用子类useNum函数的返回值是:{0}", r); Console.ReadLine(); } } } # endregion 加一个比较雷人的图片,不过,仔细想想,这样的面向对象还是很有道理的: