代码之家  ›  专栏  ›  技术社区  ›  sagar27

抽象和封装是两个不同的概念吗?抽象是一个专门与OOP相关的术语吗?

  •  1
  • sagar27  · 技术社区  · 14 年前

    2 回复  |  直到 13 年前
        1
  •  1
  •   Tom Crockett    14 年前

    抽象性越强。。。这里是抽象术语。

    我认为每个人都熟悉的抽象的最好例子是 数字 . “3”是什么意思?这可能意味着3头牛,3艘太空船,或3个梦想。这些都是不相关的东西,但它们有一些共同点;它们最基本的共同点是它们各有三个。所以“3”是一个抽象的概念,它忘记了它所量化的事物的细节。

    同样在编程中, parametric polymorphism List<A> 不管是奶牛、宇宙飞船还是梦想,只要我们选择一种类型的东西并坚持下去。

        2
  •  0
  •   user unknown    13 年前

    抽象

    功能性 编程,你可能也有。

    例如,您有一个在列表中搜索人员的方法,还有一个第二个实现,并且您不需要测量进行性能优化所需的时间。

    (伪码):

    fun measure (int count, (List<Person> persons, Person x)=>int) 
    
    measure (1000, joesSearch (myList, paul)) 
    measure (1000, amysSearch (myList, paul)) 
    

    程序性 上下文-不管有没有OOP。

    printHello (times int) {
      for (i : (1 .. times)) print ("Hello")
    }
    

    是一种抽象的形式-它抽象了很多次,应该执行一个操作,类似地

    print5times (message string) {
      for (i : (1 .. 5)) print (message)
    }
    

    即使变量也是抽象的:

    for (i : (1 .. 9)) print ("Number " + i)  
    

    我被不同的数字束缚着,所以我是一个抽象的东西。在运行时它得到具体的:数字1,2,3等等。

    封装

    更相反的是:它是一种凝固的形式。

    在GUI中,您可能有一个文本框,用户可以将文本放入其中。标签可能也有文本,但用户无法修改它。作为不同GUI元素的图标或滑块可能没有关联的文本。

     getText (label) // fine
     getText (textfield) // dito
     getText (slider) // fail
    

    封装方法是,将一个方法绑定到一个数据结构中,以便只为正确的事情(对象)调用该方法:

     label.getText ()
     textfield.getText ()
     slider.getText () // no such method in Slider
    

    私有方法不能从外部访问,但这不是封装的主要方面,而是用对象的行为绑定定义对象的数据。这是一种专业化,因此,与抽象相反。

    因此,封装背后有多种想法: 关注点分离 . 再次,我们在函数式编程中找到了封装的原则。您可能在其他方法中隐藏了方法,如本例中所示:

    定义foo()={ rekursiveFoo(generateX()) }

    rekursiveFoo可能需要一些设置,一些初始化,从外部看不到。