三周C#总结7oop--多态

例子:1.使用类String类的分割split 将字符串  Solutions to selected exercises can be found in the electronic document The Thinking in C# Annotated Solution Guide, available for a small fee from BruceEckel” 单词提取输出。单词以空格或,分割。

namespace pr7

{

    class Pr7_4

    {

        static void Main(string[] args)

        {

          

            string ss="Solutions to selected exercises can be found in the electronic document The Thinking in C# Annotated Solution Guide, available for a small fee from BruceEckel";

            string[] s = ss.Split(' ',',');//split()方法参数是char类型且是可变的

            for (int i = 0; i < s.Length; i++)

            {

                Console.WriteLine(s[i]);

            }

                Console.ReadLine();

        }

       

    }

}


2.

(综合题)完成一个完整的时期类MyDate,要求有年月日三个属性,实现其构造函数以及属性访问器函数。

1ToString函数,要求输出如1999-08-26日。

2)完成日期的加法。形式参数为天数

MyDate DateAdd(int days){.};

3)比较日期前后大小函数 ,返回0表示相等,1大于,-1小于。

  int compareTo(MyDate date){

}

4)任意给定两个日期,计算两个日期差多少天函数。

5)已知1990-01-01是星期一这个事实,完成任意给定年月,输出该月月历形式。

函数原型:

   public void dispMonthDay(int year,int month){

     

namespace pr7

{

    class MyDate

    {

        private int year;

        private int month;

        private int day;

        public MyDate(int year, int month, int day)

        {

            this.year = year;

            this.month = month;

            this.day = day;

        }

        public int Year

        {

            get

            {

                return this.year;

            }

            set

            {

                this.year = value;

            }

        }

        public int Month

        {

            get

            {

                return this.month;

            }

            set

            {

                this.month = value;

            }

        }

        public int Day

        {

            get

            {

                return this.day;

            }

            set

            {

                this.day = value;

            }

        }

        public override string ToString()

        {

            return (year + "-" + month + "-" + day + "日");

        }

        public MyDate DateAdd(int days)//相加后计算天数

        {

            MyDate md = new MyDate(this.Year, this.Month, this.Day);

            int d = md.day + days;

            if ((md.month == 1) || (md.month == 3) || (md.month == 5) || (md.month == 7) || (md.month == 8) || (md.month == 10))

            {

                if (d > 31)

                {

                    md.month = md.month + 1;

                    md.day = d - 31;

                }

                else

                    md.day = d;

            }

            else if ((md.month == 4) || (md.month == 6) || (md.month == 9) || (md.month == 11))

            {

                if (d > 30)

                {

                    md.month = md.month + 1;

                    md.day = d - 30;

                }

                else

                    md.day = d;

            }

            else if (md.month == 12)

            {

                if (d > 31)

                {

                    md.year = this.year + 1;

                    md.month = 1;

                    md.day = d - 31;

                }

                else

                    md.day = d;

            }

            else if (md.month == 2)

            {

                if ((md.year % 4 == 0) && (md.year % 100 != 0) || (md.year % 400 == 0))

                {

                    if (d > 29)

                    {

                        md.day = d - 29;

                        md.month = md.month + 1;

                    }

                }

                else if (d > 28)

                {

                    md.day = d - 28;

                    md.month = md.month + 1;

                }

                else

                    md.day = d;

            }

            return md;

        }

        public int compareTo(MyDate date)//比较大小

        {

            int flag = 0;//标志位

            if (this.Year > date.year)

                flag = 1;

            else if (this.Year < date.Year)

                flag = -1;

            else

            {

                if (this.Month > date.Month)

                    flag = 1;

                else if (this.Month < date.Month)

                    flag = -1;

                else

                {

                    if (this.Day > date.Day)

                        flag = 1;

                    else if (this.Day < date.Day)

                        flag = -1;

                    else

                        flag = 0;

                }

            }

            return flag;

        }

        public int xc(MyDate date)//计算相差的天数

        {

            MyDate min = this;

            MyDate max = date;

            int sum = 0;//定义距离那个小的日期的天数

            int sum1 = 0;//定义小的日期距离这一年开始的天数

            int jg = 0;

            int pd = this.compareTo(date);

            if (pd == 0)

                return 0;

            else if (pd > 1)

            {

                min = date;

                max = this;

            }

            for (int i = min.Year; i < max.Year; i++)

            {

                if ((min.Year % 4 == 0 && min.Year % 100 != 0) || min.Year % 400 == 0)

                    sum = sum + 366;

                else

                    sum = sum + 365;

            }

            for (int i = 1; i < max.Month; i++)

            {

                if ((i == 1) || (i == 3) || (i == 5) || (i == 7) || (i == 8) || (i == 10) || (i == 12))

                    sum = sum + 31;

                else if ((i == 4) || (i == 6) || (i == 9) || (i == 11))

                    sum = sum + 30;

                else if ((max.Year % 4 == 0 && max.Year % 100 != 0) || max.Year % 400 == 0)

                {

                    if (i == 2)

                    {

                        sum = sum + 29;

                    }

                }

                else

                    sum = sum + 28;

            }

            sum = sum + max.Day;

            for (int i = 1; i < min.Month; i++)

            {

                if ((i == 1) || (i == 3) || (i == 5) || (i == 7) || (i == 8) || (i == 10) || (i == 12))

                    sum1 = sum1 + 31;

                else if ((i == 4) || (i == 6) || (i == 9) || (i == 11))

                    sum1 = sum1 + 30;

                else if ((min.Year % 4 == 0 && min.Year % 100 != 0) || min.Year % 400 == 0)

                {

                    if (i == 2)

                    {

                        sum1 = sum1 + 29;

                    }

                }

                else

                    sum1 = sum1 + 28;

            }

            sum1 = sum1 + min.Day;

            jg = sum - sum1;

            return jg;

        }

    }

    class Pr7_5

    {

        static void Main(string[] args)

        {

            MyDate md = new MyDate(2012, 3, 20);

            Console.WriteLine(md);

            MyDate mm = md.DateAdd(70);

            Console.WriteLine(mm);

            int flag = md.compareTo(mm);

            if (flag > 1)

                Console.WriteLine(md.ToString() + "大于" + mm.ToString());

            else if (flag < 1)

                Console.WriteLine(md.ToString() + "小于" + mm.ToString());

            else

                Console.WriteLine(md.ToString() + "等于" + mm.ToString());

            int ts = md.xc(mm);

            Console.WriteLine("相差:" + ts + "天");

            Console.ReadLine();

        }

    }

}


1.当父类某个函数允许覆盖(虚函数virtual),子类同名函数(形参也相同)可以上传并覆盖父类虚函数,形成动态绑定。

class A{

      public virtual void fun1(){

        …

      }

      public void fun2(){

        …

      }

  }

  class B: A{

      public override void fun1(){

        …

      }

      public void fun2(){

        …

A obj1=new A();

obj1.fun1();  //A

obj1.fun2(); //A
    B obj2=new B();

obj2.fun1();  //B

obj2.fun2(); //B
    A obj3=new B();

obj3.fun1();  //A实例中fun1()是虚函数被子类实例 fun1()覆盖。

obj3.fun2(); //A
      obj3.fun3();//错误,不能调用子类成员函数。

2.多态性概念:

使用同一个名称,其依据Context不同,产生不同功能。如对象调用同一函数,随着引用实例不同,实现功能也不相同。

Shape shape=new Cirlce();

      shape.area();

shape=new Rect();

      shape.area();

在OOP编程中,实现多态一般通过子类重写父类中虚函数或抽象函数来实现,

abstract class Shape{

    public abstract double area();

    public void disp(){

       …

    }

}

抽象类不能实例化.(基类)

class Circle :Shape{

    public override double area(){

       ..

    }

3.接口Interface定义与使用

   接口是一种特殊类,接口中只有抽象函数与抽象属性声明

1)接口定义

   interface IShape

    {

         double area();

         double length();

    }

    class Circle : IShape

    {

        private double r;

        public Circle() { }

        public Circle(double r)

        {

            this.r = r;

        }

        public  double area()

        {

            return Math.PI*r*r;

        }

        public double length()

        {

            return 2 * Math.PI * r;

        }

    }

    class Rect : IShape

    {

        private double w, h;

        public Rect() { }

        public Rect(double w, double h)

        {

            this.w = w; this.h = h;

        }

        public double area()

        {

            return w*h;

        }

        public double length()

        {

            return 2*(w+h);

        }

    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值