抽象=封装+数据隐藏?

时间:2018-01-20 03:52:03

标签: oop encapsulation abstraction

我经历了很多帖子,但没有明白这一点。

我们可以说:抽象=封装+数据隐藏

或者不止于此!!

由于

1 个答案:

答案 0 :(得分:1)

这个问题更像是一个面向对象的问题。 #oop将是一个很好的标签,包含在这里。

回答你的问题: 不,抽象不等于封装和数据隐藏。顺便说一句,抽象和封装都有数据隐藏概念。但是,它们并不相同。

封装是关于隐藏类中的变量或方法以防止来自外部世界的任何更改。 然后我们可以控制通过getter / setter方法操作的内容。简单的例子是我们有一个Person类。在这个Person类中,我们假设我们有一个变量来跟踪年龄。现在,我们有一个GetAge()方法来返回Person的年龄;另一方面,我们已经修改了SetAge(int age)方法,只有在传入参数的年龄大于当前年龄时才设置新的年龄(因为我们只是随着时间的推移而变老...)。 / p>

public class Person {

    private int age;

    public Person(int age) { 
        this.age = age; 
    }

    public int GetAge() { 
        return age 
    }

    public void SetAge(int age) {
        if (this.age < age) { 
            this.age = age; 
        }
    }
}

抽象用于提取和突出显示将为通用抽象类接口共享的主要功能。简单的例子是我们有一个IAnimal的接口。在这个界面中,我们只为Eat(int numOfBowls)和Sleep(double hours)方法创建一个模板。 我们已经为任何动物抽取了必要的方法(这是抽象)。下面的代码将清楚地显示我的意思,但我也举了一个使用继承的例子,这是面向对象编程的另一个主要概念(这里不会涉及,因为它超出了范围从手头的问题)。

public interface IAnimal {
    void Eat(int numOfBowls);
    void Sleep(double hours);
}

public class Dog : IAnimal {

    public void Eat(int numOfBowls) {
        // eat numOfBowls passed in
    }

    public void Sleep(double hours) {
        // sleep for number of hours passed in
    }

    public void Bark() { 
        Console.WriteLine("woof");
    }
}