2015-03-02 5 views
-2

Я все больше смущаюсь при чтении определений инкапсуляции и абстракции в разных источниках. Очень сложно решить, какое правильное определение.Оборация ООП против инкапсуляции нескольких определений

определение Инкапсуляции 1

Инкапсуляция: Инкапсуляция это метод для полей в классе приватный и обеспечение доступ к полям с помощью общедоступных методов

определения Инкапсуляции 2

Инкапсуляция - это процедура скрытия данных и функций в петь le unit (называемый классом).

определение Абстракции 1

Абстракция является способом моделирования объекта реального мира с минимальным информации.

определение абстракция 2

Подвергая только те методы, которые необходимы.

Пожалуйста, помогите мне в понимании правильного определения этих слов, относящихся к ООП. Также предпочтителен источник книги, в котором объясняются правильные определения.

+4

Нет никакого правильного определения. Каждая версия, которую вы давали, говорила * о * инкапсуляции/абстракции, но не авторитетно * определяет * ее. –

+0

Возможный дубликат [Как инкапсуляция отличается от абстракции как объектно-ориентированной концепции в java?] (Http://stackoverflow.com/questions/8960918/how-encapsulation-is-different-from-abstraction-as-a-object -ориентированный-концепт-in) – Tachyon

+1

Так как это понятия, то нет определенного определения, которое принято на глобальном уровне. Например, большинство людей рассмотрят два определения Encapsulation в вашем вопросе выше как эквивалент ... Научитесь использовать Google и Википедию ... они ваши друзья. – RudolphEst

ответ

1

Говоря о коде, абстракция - это просто фрагмент кода, который описывает реальную «вещь» реального мира. В большинстве случаев вы не можете описать всю «вещь», но вы можете описать ее основные характеристики, которые в вашем коде будут называться атрибутами.

Одним из примеров абстракции будет ресторан: вы идете, вы просите меню и выбираете все, что хотите есть ... но вы не едите бумагу: вы выбираете то, что хотите посмотреть абстракция (меню) ... эта абстракция может просто сказать «Яйца & Бэкон», но когда официант приносит ваш заказ, у него есть пара яиц (скремблирование), два куска хрустящего бекона и некоторые другие вещи. . Меню - это просто абстракция real вещь.

Возьмите Bicycle example in the Java Tutorials: Велосипед имеет атрибуты:

  1. Скорость
  2. трансмиссионные
  3. Cadence

Вы не заинтересованы (в данном примере) в любых других характеристик велосипед ... так что это абстракция.

Теперь о инкапсуляция: при написании кода, вы хотите атрибуты вашего объекта, чтобы модифицировать только в «Проппер» путь: Если вы измените скорость (опять же на примере велосипеда) вы, возможно, придется также изменить каденцию и/или изменить передачу. Таким образом, вы объявляете атрибуты private и обновлять их только через public методы, и, в этих методах, вы убедитесь, что все атрибуты имеют согласованные значения:

public class Bicycle { 
    private int speed, gear, cadence; 
    /** 
    * Default constructor 
    */ 
    public Bicycle() { 
     speed = 0; 
     gear = 1; 
     cadence = 0; 
    } 
    /** 
    * An example 
    */ 
    public void setSpeed(int speed) { 
     this.speed = speed; 
     /* 
      You can set the value of the other attributes here if you want to 
     */ 
    } 
    /** 
    * Another example 
    */ 
    public void gearUp() { 
     if(gear < 5) 
      gear++; 
     /* 
      Here you are preventing other methods to set the gear to 
      a value higher than 5. 
     */ 
    } 
    /** 
    * Another one 
    */ 
    public void gearDown() { 
     if(gear > 1) 
      gear--; 
     /* 
      Here you are preventing other methods to set the gear to 
      a value lower than 1. 
     */ 

    } 
} 
0

Возьмем, например, два фрагмента кода ниже:

// Snippet #1 
public static void Main(){ 
    int sum = 0; 
    for (int i = 0; i <= 1000; i++) { 
     sum += i; 
    } 
    System.out.println(sum); 
} 

В приведенном выше фрагменте программа вычисляет сумму всех целых чисел от 0 до 1000. Вы можете видеть, как выполняется вычисление, и вы контролируете переменную, в которой хранится значение суммы.

// Snippet #2 

public class Adder { 
    private int sum; 

    public Counter(){ 
     this.sum = 0; 
    } 

    public void add(int value){ 
     this.sum += value; 
    } 

    public int getSum(){ 
     this.sum; 
    } 
} 

public static void Main(){ 
    Adder adder = new Adder(); 
    for (int i = 0; int <= 1000; i++) { 
     adder.add(i); 
    } 
    System.out.println(adder.getSum()); 
} 

Отрывок сверху выполняет ту же задачу, но по-разному. Существует класс, который предоставляет две характеристики, о которых вы спрашивали. Он предоставляет абстракцию, чтобы систематически добавлять номера, а также инкапсулирует информацию о том, как производится вычисление. Другими словами, это отделяет внимание от добавления чисел и того, как это работает из задачи повторения чисел от 0 до 1000 (в главной функции).

В этом примере:

  • абстракции является понятие сложения чисел, так что вы бы иметь другой абстракции для каждого типа идеи

  • encaptulation является разделение деталей реализации от основной программы. То есть вы можете создать новый класс для одного и того же типа абстракции, но использует другую реализацию (например, , а не un int).

1

Абстракция
Абстракция не должны делать с созданием методов частным или государственным. Это связано с признанием того, какие функции являются общими для типа класса.

В java абстрактный класс делает шаг дальше интерфейса. В интерфейсе говорится, что классы типа X должны делать X, Y, Z. X, Y, Z могут быть реализованы в любом случае по вашему выбору.

В абстрактном классе говорят, что классы типа X должны выполнять X, Y, Z, но метод, отмеченный абстрактом, должен выполняться определенным образом, поэтому он реализуется в абстрактном классе (абстракция).

Инкапсуляция
Это просто упаковка одной или нескольких вещей в другую вещь. Чтобы упростить или скрыть код. Одним из примеров того, почему вы хотите сделать это, является упрощение потока.Если вы хотите, чтобы пользователь мог выключить компьютер, например, вы можете может либо иметь кучу метода для кого-то назвать явно:

Util.shutdownApps(); 
Util.shutdownServices(); 
Util.shutdownScreenAndKeyboard(); 
Util.poweroff(); 

Если вы хотите, чтобы закрыть определенным образом или просто сделать вам легче закрыть его, чтобы его можно было инкапсулировать:

Util 
    public void shutdown(){ 
    Util.shutdownApps(); 
    Util.shutdownServices(); 
    Util.shutdownScreenAndKeyboard(); 
    Util.poweroff(); 
    } 

    private shutdownApps(){...} 
    private shutdownServices(){...} 
    private shutdownScreenAndKeyboard(){...} 
    private poweroff(){...} 
+0

относительно ответа Барранки, любой фрагмент кода может описать реальный мир. Нет смысла иметь абстрактный класс, если у вас будет только один * этого типа. Кто-то, я уверен, скажет о, но интерфейс будет лучше для проверки. Но если у вас есть, зачем делать дополнительный код? Вы можете реорганизовать, когда вы выясните, что вам нужны разные подобные типы. – Savan

Смежные вопросы