XWorker
简介
特点
下载

 面向事物
面向事物的概念
面向事物和面向对象对比
面向事物的哲学

 示例
事物的创建过程 
SWT
WEB
代码生成
YahooYUI

 关于
协议
联系我们

 

 面向事物和面向对象的对比

目录

前言

    这里把面向事物和面向对象的概念做一个比较,希望能够通过面向对象来增加对面向事物的了解。

面向事物和面向对象的异同

  1. 面向事物和面向对象的差异

    面向事物和面向对象的本质差异在于事物和对象的定义不同。

事物:一切客观存在的物体和现象。
对象:是人们要进行研究的任何事物。

    从事物和对象的定义可以看出事物是客观存在的任何东西,而对象是人们要进行研究的任何事物,所以面向事物和面向对象的本质区别是看待事物的角度不同。

    在看待事物的角度上,面向对象是从主体出发看待目标事物,而面向事物并不强调主客体,在面向事物中我们可以以主体的角度去看待目标事物,目标事物也有可能以其自身为主体把我们作为目标事物,所以在面向事物里主体和客体事物是平等的、相互作为对象的。

    由于面向事物并不强调看待事物的主客体,所以面向事物的范围要比面向对象更加广泛、更加基础,也因为看待事物的角度不同,所以面向事物和面向对象是两个全然不同的概念。

  1. 面向事物和面向对象的相通之处

    对象是主体的目标事物,面向对象和面向事物最终的目标都是事物,因而面向事物和面向对象还是有很多相通之处。

  • 对象的目标是事物

面向事物和面向对象的最终目标都是事物。

  • 事物和对象都具有状态和行为

对象是目标事物,对象和事物本指是相同的,它们都具有状态和行为。

  • 类和描述

类是面向对象的概念,描述是面向事物的概念。

类是对象的抽象,所以可以说类能起到描述说明对象的作用,而描述说明对象(事物)则是面向事物中的描述的概念。

所以虽然面向事物中没有类的概念,但面向事物中也有描述说明事物的能力,在面向事物中使用一个事物来描述另一个事物也能起到分类的作用。

类是对象的抽象,类的属性和操作是对象的属性和操作的抽象,在面向事物里作为一个事物的描述的描述事物也有属性和操作说明,描述事物的属性和操作说明能够描述被描述事物的属性和操作,所以类和描述事物的作用是相通的。

  • 继承

面向事物和面向对象都有继承的概念,在面向事物和面向对象中继承的作用是相同的,但在面向对象中一般是类的继承而对象之间没有继承,而在面向事物中任何事物之间都是可以相互继承的。

  • 多态

多态性是面向对象的一个特点,面向事物中虽然没有多态的说法,但相通的现象是存在的。

面向对象中的多态是有类的继承而实现的,而在面向事物中也有描述和继承,所以一个事物的行为是有可能是描述事物、继承事物或自身定义的,因而存在“多态”性。

面向事物的“多态”可能不值得一提,因为从事物的角度看是不存在“多态”的说法的,但面向对象的多态和面向事物的“多态”形成的本质和现象都是相通的。

  1. 面向事物和面向对象的其他异同

    面向事物和面向对象有一些其他方面的异同。

  • 面向事物的完备性

在面向事物里所有事物的集合是完备的,所有事物的集合中的任何一个事物都能够被这个集合中的事物所描述,描述集合中的任何一个事物并不需要集合之外的其他事物的帮助。

面向对象是没有完备性的,面向事物的完备性用面向对象的概念描述就是:类也是一种对象,每个类作为对象也有自己的类,所有对象的类和所有类的类都在一个集合中。

  • 面向事物的构造性

在面向对象里通过类可以实例化对象,而与此相通的功能则是在面向事物里通过一个事物可以构造另一个事物。

在面向事物里构造事物最初只需一个事物(元事物),通过这个事物就可以直接或者间接的构造出任意其他事物。

面向事物和面向对象的实例对比

    在以下对比中我们将创建Person、Father和Child等类和相应的类的对象实例,以及在XWorker中创建与这些类和对象实例相对应的事物,用来对比说明面向事物和面向对象。

  1. 类和描述

     定义Person类和Person事物。

     Person类的代码如下:

package xworker.example;

public class Person {
    String name;
    int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
	
    public String whoAmI(){
        return "I am a Person, my name is " + name;
    }
	
    public String getName(){
        return name;
    }
	
    public void setName(String name){
        this.name = name;
    }
	
    public int getAge(){
        return age;
    }
	
    public void setAge(int age){
        this.age = age;
    }
}

     Person事物定义在example:otandoo:example.Person,用XML表示大致如下:

<thing name="Person" label="Person" descriptors="core:things:lang.MetaDescriptor3">
    <attribute name="name"/>
    <attribute type="int" name="age"/>
    <actions name="actions">
        <GroovyAction name="whoAmI" 
            code="return "I am Person, my name is content";"/>
    </actions>
</thing>

    可以看到以上Person类和Person事物都定义了name和age两个属性,它们都有一个whoAmI方法。

    Person类是不能直接运行的,只有它的对象实例或静态方法才能运行,不过Person事物只是一个普通事物,所以Person事物可以运行,我们可以在编辑Person事物的编辑器中运行whoAmI方法。

   如上图在Person事物的编辑界面,选择动作列表中的whoAmI,点击后台运行后运行按钮可以运行此方法,运行结果是:

I am a Person, my name is Person
  1. 类的对象实例和事物的构造

    可以通过类来实例化对象,相似的是在面向事物中可以通过一个已存在的事物来构建新事物,这里就用Person类和Person来初始化和构建一个名为张三的对象和事物。

    Person类的对象实例以及测试代码如下:

package xworker.example;

public class TestPerson {
    public static void main(String args[]){
        Person zhangSan = new Person("张三", 40);		
        System.out.println(zhangSan.whoAmI());
    }
}

     以上代码运行的结果是:

I am a Person, my name is 张三

    通过Person构造的事物是example:otandoo:example.TestPerson,用XML表示大致如下:

<Person name="张三" age="40"/>

     可以在TestPerson的编辑界面选择whoAmI方法运行。

    运行的结果是:

I am a Person, my name is 张三
  1. 类的继承和事物的继承

     这里创继承Person类的Father和Child两个类,其中Fahter有属性Child,Child有属性Father,另外也对应的在XWorker中建立相对应的事物。

     Father类是:

package xworker.example;

public class Father extends Person{
    Child child;
	
    public Father(String name, int age){
        super(name, age);
    }
	
    public void setChild(Child child){
        this.child = child;
    }
	
    public String whoAmI(){
        return "I a Father, my name is " + name +
               " and my child is " + child.getName();
    }
}

     Child类是:

package xworker.example;

public class Child extends Person {
    Father father;
	
    public Child(String name, int age){
        super(name, age);
    }
	
    public void setFather(Father father){
        this.father = father;
    }
	
    public String whoAmI(){
        return "I a Father, my name is " + name +
                " and my father is " + father.getName();
    }
}

     测试运行Father和Child的程序是:

package xworker.example;

public class TestFatherAndChild {
    public static void main(String[] args){
        Father father = new Father("张三", 40);
        Child child = new Child("张小三", 10);
		
        father.setChild(child);
        child.setFather(father);
		
        System.out.println(father.whoAmI());
        System.out.println(child.whoAmI());
    }
}

     测试程序运行的结果是:

I a Father, my name is 张三 and my child is 张小三
I a Child, my name is 张小三 and my father is 张三

     以下是相应的事物。

     Father事物是example:otandoo:example.Father,使用XML表示大致如下:

<thing name="Father" label="Father" descriptors="core:things:lang.MetaDescriptor3">
    <thing extends="example:otandoo:example.Child" name="Child" 
             descriptors="core:things:lang.MetaDescriptor3:/@thing"/>
    <actions name="actions">
        <GroovyAction name="whoAmI" 
              code="return "I am a Father, my name is content and my child is " 
                  + self.getThing("Child@0").name;"/>
    </actions>
</thing>

     Child事物是example:otandoo:example.Child,使用XML表示大致如下:

<thing name="Child" label="Child" descriptors="core:things:lang.MetaDescriptor3">
    <thing extends="example:otandoo:example.Father" name="Father" 
              descriptors="core:things:lang.MetaDescriptor3:/@thing"/>
    <actions name="actions">
        <GroovyAction name="whoAmI" 
              code="return "I am a Child, my name is content and my father is "
                   + self.getThing("Father@0").name;"/>
    </actions>
</thing>

     测试事物是example:otandoo:example.TestFatherAndChild,使用XML表示大致如下:

<thing name="TestFatherAndChild" label="TestFatherAndChild" 
         descriptors="core:things:lang.MetaDescriptor3">
    <Father name="张三" age="40">
        <Child name="张小三" age="10"/>
    </Father>
    <Child name="张小三" age="10">
        <Father name="张三" age="40"/>
    </Child>
    <actions name="actions">
        <GroovyAction name="test" code="
            def father = self.getThing("Father@0");
            def child = self.getThing("Child@0");

            println father.doAction("whoAmI");
            println child.doAction("whoAmI");"/>
    </actions>
</thing>

     运行测试事物的test方法结果如下:

I a Father, my name is 张三 and my child is 张小三
I a Child, my name is 张小三 and my father is 张三
  1.  面向事物和面向对象的实例对比总结

    从以上实例对比中可以看到面向事物和面向对象有很多相通之处,面向对象的类、继承等概念和面向事物的描述、继承概念是相通的。

 

Copyright ©  2007-2008 XWorker.org  版权所有

沪ICP备08000575号