zoukankan      html  css  js  c++  java
  • 自学面向对象

    面向对象编程(OOP,Object(对象) Oriented(面向) Programming(编程))
    是将现实世界中的概念模拟到计算机程序中,它将现实世界中的所有事物视为对象。

    万物皆对象 类为产品的蓝图,对象为一个产品。
    blueprint manufacture = new blueprint();

    例如一辆汽车 属性有颜色,速度;方法有加速,减速。

    class Car //定义一个Car类
    {
     string color;   //颜色
     int speed;      //速度
     void speedup()  //加速
     {
      //语句;
     }
     void slowDown() //减速
     {
      //语句;
     }
    }

    我们平日要看电视,只需会用遥控器就可以了,而无需了解电视的内部构造。
    这种内部信息的隐藏就叫做‘封装’

    public class TV  //定义一个TV类
    {
     string image=黑白; //图像
     string sound=立体声; //声音
     void inner()  //内部构造
     {
      //语句;
     }
    }

    访问修饰符
    public          可被所属类的成员以及不属于类的成员访问
    internal        可被当前程序集访问
    protected     可被所属类或派生类的类型访问
    private          仅所属类的成员才可以访问

    电视机从黑白到彩色再到高清晰,无论怎么变都会有图像与声音,下一代继承上一代的特点并有所发展。
    这个就叫做‘继承’

    class ClearTV:TV //定义派生类ClearTV继承于基类TV
    {
     string image2=高清晰; 
    }

    电视机无论如何升级换代,但是旧的VCD依然可以插在最新的电视机上,这个就说明电视机的接口是稳定的。
    ‘接口’就是某些事物对外提供的一些功能的声明。

    public interface VCD
    {
     void Play() //播放
     {
      //语句;
     }
    }

    注意:实现接口的语法与实现继承一样,同样使用(冒号) :

    一个类派生自另一个类,也可以实现接口

    class ClearTV:TV,VCD //TV类与VCD接口派生出ClearTV类
    {
     string ClearImage=高清晰; 
    }

    如果两个接口内部有同样的方法名,那该如何调用呢,这时候就需要使用到显式接口

    public interface DVD
    {
     void Play() //播放
     {
      //语句;
     }
    }
    class ClearTV:TV,VCD,DVD //TV类与VCD接口与DVD接口派生出ClearTV类
    {
     string image2=高清晰;
     void VCD.Play() //VCD播放
     {
      //语句;
     }
     void DCD.Play() //DVD播放
     {
      //语句;
     }  
    }


    一个洗衣机可以根据放进衣服的肮脏程度来判断所需的洗涤时间,这种功能就叫做多态
    方法重载

    public class Washer //洗衣机
    {
     void abstersion(int cleanlily) //干净衣服的洗涤方法
     {
      //语句;
     }
     void abstersion(long dinginess) //肮脏衣服的洗涤方法
     {
      //语句;
     }
    }

    方法重写

    我想把骑自行车的速度变成汽车那么快
    class bicycle
    {
     public virtual void career()    //该方法支持重写
     {
      Console.WriteLine("每小时10公里");
     }
    }
    class Car:bicycle
    {
     public override void career() //重写
     {
      Console.WriteLine("每小时200公里");
     }
    }

    抽象方法

    抽象方法的目的在于指定派生类必须实现与这一方法关联的行为。
    abstract class ABC   //抽象类abc
    {
     public abstract void AFunc(); //抽象方法
    }
    class Derv:ABC   //派生类
    {
     public override void AFunc() //使用 override关键字可在派生类中实现抽象方法
     {
      Console.WriteLine("实现抽象方法");
     }
    }

    基类实现了抽象类,则派生类不需要重新实现该抽象类。
        abstract class MyAbs  //抽象类
        {
            public abstract void AbMethod();
        }
        class MyClass:MyAbs  //派生类
        {
            public override void AbMethod()
            {
                Console.WriteLine("在MyClass中实现的抽象方法");
            }
        }
        class SubMyClass:MyClass //派生自MyClass的子类
        {
            public void General()
            {
                Console.WriteLine("在SubMyClass中未实现的抽象方法");
            }
        }
        class MyClient
        {
            static void Main()
            {
                SubMyClass objSubClass = new SubMyClass();
                objSubClass.General();
            }
        }
    如果你还认为输出结果是:
    在MyClass中实现的抽象方法
    在SubMyClass中未实现的抽象方法
    那就错了!。

    正确输入结果:
    在SubMyClass中未实现的抽象方法
    记住 派生类不需要重新实现该抽象类!

    编程高手不是看原理看出来的,而是靠代码打出来的。我也用所学练习一下。

    创建一个Shape类,此类包含一个名为_color的数据成员(用于存放颜色值)和一个getColor()方法(用于获取颜色值)。这个类还包含一个名为getArea()的抽象方法。用这个类创建名为Circle(圆形)和Square(正方形)的两个子类,这两个类都包含两个数据成员,即_radius和_sideLen 这些派生类应提供getArea()方法的实现,以计算相应形状的面积。

        abstract class Shape
        {
            public string _color;
            public void getColor()
            {
                Console.WriteLine("输入颜色:");
                this._color = Console.ReadLine();
            }
            public abstract void getArea();
        }
        class Circle : Shape
        {
            double _radius;
            double _sideLen=3.14;
            public override void getArea()
            {
                Console.WriteLine("输入圆形半径:");
                this._radius = double.Parse(Console.ReadLine());
                Console.WriteLine("颜色为{0},面积为{1}的圆形", _color, _radius * _sideLen);
            }
        }
        class Square : Shape
        {
            double _radius;
            public override void getArea()
            {
                Console.WriteLine("输入正方形边长:");
                this._radius = double.Parse(Console.ReadLine());
                Console.WriteLine("颜色为{0},面积为{1}的正方形", _color, _radius * _radius);
            }
        }
        class Test
        {
            static void Main()
            {
                Circle objCircle = new Circle();
                Square objSquare = new Square();
                objCircle.getColor();
                objCircle.getArea();
                objSquare.getColor();
                objSquare.getArea();
            }
        }

    控制台输出:
    输入颜色:
    blue
    输入圆形半径:
    5
    颜色为blue,面积为15.7的圆形
    输入颜色:
    red
    输入正方形边长:
    5
    颜色为red,面积为25的正方形

  • 相关阅读:
    Light oj 1082 Array Queries(区间最小值)
    Codeforces Round #179 (Div. 2)A、B、C、D
    poj 1976 A Mini Locomotive(01背包)
    Codeforces Round #178 (Div. 2)
    hackerrank challenges median
    poj 1961 Period(kmp最短循环节)
    poj 2182 Lost Cows(树状数组)
    ZOJ1117 POJ1521 HDU1053 Huffman编码
    poj 2352 Stars 树状数组
    这可能是最适合萌新入门Web安全的路线规划
  • 原文地址:https://www.cnblogs.com/mxy1028/p/1594422.html
Copyright © 2011-2022 走看看