惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
云风的 BLOG
云风的 BLOG
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Privacy International News Feed
F
Full Disclosure
P
Proofpoint News Feed
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
The Blog of Author Tim Ferriss
T
Threatpost
L
Lohrmann on Cybersecurity
I
Intezer
S
SegmentFault 最新的问题
小众软件
小众软件
T
Threat Research - Cisco Blogs
MongoDB | Blog
MongoDB | Blog
美团技术团队
NISL@THU
NISL@THU
罗磊的独立博客
N
News | PayPal Newsroom
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 聂微东
W
WeLiveSecurity
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
A
Arctic Wolf
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
I
InfoQ
Microsoft Azure Blog
Microsoft Azure Blog
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
U
Unit 42
The Cloudflare Blog
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Announcements
Recent Announcements
D
DataBreaches.Net
量子位

博客园 - 牟向阳

Implementing SQL Server Row and Cell Level Security Daily English 你知道你的後照鏡調錯了嗎?原來裡面隱藏著視線死角! Silverlight Freezing & Crash Silverlight 中实现Service同步调用 Silverlight:获取ContentTemplate中的命名控件 silverlight 4常用的多线程技术 推荐几款Silverlight Tools【转载】 一个配置文件的Mapping Emit Vs CodeDom Custom DataContractSerializerOperationBehavior SQL Service查询分析 WPF&Silverlight精髓 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL) WCF学习经验分享,如何更好地学习WCF? 后台管理界面收集 两个使用的Ajax Demo 发几个有价值的.net源码 我是如何带领团队开发项目的
自学面向对象
牟向阳 · 2009-11-02 · via 博客园 - 牟向阳

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