自学面向对象

面向对象编程(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的正方形

原文地址:https://www.cnblogs.com/mxy1028/p/1594422.html