2012-02-02 1 views
4

Я изо всех сил пытаюсь объяснить понятия oop в java.Инкапсуляция Java OOP. Почему Object.doSomething(); лучше, чем doSomething (Object) ;?

Основным принципом в oop является то, что объекты имеют методы; поэтому Object.method(); работает. Я сопоставляю это с процедурным программированием, в котором нужно делать метод (объект).

Это называется инкапсуляцией?

Каковы преимущества упреждающего способа?

+4

Я не хочу быть грубым, но почему вы объяснить эти понятия никому, если вы их не понимаете? Или вы имели в виду, что вы пытаетесь понять эти понятия? –

+1

переместите этот вопрос на programmers.stackexchange.com – jamesTheProgrammer

ответ

2

В сценарии Object.doSomething(), объект будет иметь полный контроль над его свойствами, которые используются в методе.

Но в другом вызове doSomething (Object), вы должны сделать все свойства объекта общедоступными, чтобы они были доступны в методе. Это не более безопасная операция.

+1

Хммм, что, если в сценарии 2 У меня есть частные свойства, доступные с помощью getter/seters? Разве они не будут доступны? – Gevorg

+0

@Gevorg. Они только в getter/setter, у вас все еще есть контроль над этими частными свойствами, и вы покажете им, как хотите, внешним классам. –

4

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

0

ООП евангелизирует инкапсуляцию; в результате состояние и поведение инкапсулируются в класс, представляющий объект. В зависимости от того, на каком уровне вам будет происходить инкапсуляция, используйте инкапсуляцию на основе статического (класса) или экземпляра (на уровне объекта).

0

метод (объект) - это парадигма, которая работает с структурами данных. Структуры данных - это группировка полей информации, которые являются семантически непротиворечивыми и взаимосвязаны (т. Е. Struct Person {FirstName, LastName, DateOfBirth}).

Объектно-ориентированное программирование на один шаг выше структур данных. В ООП мы не только группируем связанные поля данных, но также включаем функции (методы, функции-члены), которые связаны с данными (и которые действуют на данные правильным образом).

Инкапсуляция заключается в сохранении части элементов, принадлежащих объектам. Цель состоит в том, чтобы «скрыть» внутреннюю работу из внешнего мира и защитить состояние объекта от «коррупции» или от присвоения неверных значений. Языки ООП предоставляют несколько «модификаторов доступа», которые используются для указания того, может ли доступ к данному члену получить определенная категория объектов (экземпляры дочерних классов, классов в одном и том же «пакете/пространстве имен/библиотеке», любом другом классе и т. Д.).

object.method() обычно запрашивает объект для выполнения чего-то, что может включать доступ к полю, которое не доступно вне класса.

Выше было определение и объяснение того, как концепция функции (метода) участника и концепция инкапсуляции идут рука об руку.

Referrences: 
http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29 
http://en.wikipedia.org/wiki/Object-oriented_programming 
1

Еще два преимущества ООП - повторное использование и полиморфизм.

REUSE: Если вы используете doSomething(Object) в один файл или одну программу, она может прекрасно работать для этой программы. Теперь представьте, что вам нужно использовать Object в другой программе. Вам нужно будет продублировать метод doSomething() в вашей новой программе (возможно, скопируйте и вставьте его). Это может сработать, но это плохая практика и делает сохранение этой логики кошмаром.Если логика doSomething() является функцией внутри Object, тогда эта логика «живет» с объектом.

Полиморфизм: Представьте себе другой случай, когда Object является лишь одним из многих подобных типов. Если вы воспользуетесь интерфейсами, многие объекты могут реализовать функцию doSomething() в соответствии с их конкретными потребностями.

Пример:

interface ICar 
{ 
    void doSomething(); 
    void getFuel(); 
} 

class GasCar : ICar 
{ 
    public void doSomething() 
    { 
     //do something a gas car would do 
    } 
    public void getFuel() 
    { 
     //logic to pull gas out of a tank 
    } 
} 

class ElectricCar : ICar 
{ 
    public void doSomething() 
    { 
     //do something an electric car would do 
    } 
    public void getFuel() 
    { 
     //logic to pull fuel out of a battery 
    } 
}