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