2016-05-10 4 views
1

Я немного смущен насчет абстракции в java.JAVA - Абстракция

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

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

Что я не понимаю, так это то, как это скрывает данные? Вы получите доступ к коду после реализации класса/интерфейса, и вы измените его в соответствии с вашими потребностями.

Я проверил много вопросов, статей об этом, но все еще смущен.

Любая помощь приветствуется. Спасибо.

+0

Он не скрывает от вас, но от клиента. –

+0

Клиент? Но что ему не нравится в коде? –

+0

Вы говорите об абстрактных классах вообще? интерфейсы? полиморфизм? – 1N5818

ответ

2

Может быть пример поможет вам лучше. Предположим, вы хотите реализовать класс Graph, который может иметь список смежности или матрицу смежности для представления своих узлов.Таким образом, в абстрактной вы хотите «AddNode» «addEdge» на этом графике, по крайней мере:

public abstract class Graph 
{ 
    public abstract int addNode(); 
    public abstract void addEdge(int from, int to); 
} 

Теперь вы можете продлить два класса:

public class GraphAdjList extends Graph 
{ 
    private Map<Integer,ArrayList<Integer>> adjListsMap; 
    public int addNode() 
    { 
     //list based implementation 
    } 
    public void addEdge(int from, int to) 
    { 
     //list based implementation 
    } 
} 

public class GraphAdjMatrix extends Graph 
{ 
    private int[][] adjMatrix; 
    public int addNode() 
    { 
     //matrix based implementation 
    } 
    public void addEdge(int from, int to) 
    { 
     //matrix based implementation 
    } 
} 

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

Graph g1,g2; 
g1 = new GraphAdjList(); 
g2 = new GraphAdjMatrix(); 

g1.addEdge(1,2); 
g2.addEdge(1,2); 

через полиморфизм вы называете две различных функций, но получить тот же результат, как Clie nt графика.

Другой пример реальной жизни - это автомобильные тормоза. Как автомобильный клиент, производитель дает вам педаль, чтобы проталкивать, не зная, какова реализация тормоза в задней части. Это может быть тормоз барабанного тормоза или дискового тормоза в задней части. Все, что вам нужно - нажать на тормоз!

+0

Да, это удобно. На хинди мы говорим об этом: «Ешь манго, не нужно считать деревья». Надеюсь, вы понимаете :-) –

1

Скрытие данных - это когда вы не можете понять, как работать с API внутри страны (например, ArrayList), не читая документацию. Создатели API не предоставляют никакого доступа к массиву, который лежит там.

Вы скрываете реализацию API от пользователей, которые будут их использовать. Им не следует беспокоиться о том, как это работает внутри страны, их интересует только функциональность, которая им предоставляется.

Об этом есть a good article.

+1

Это имеет смысл. –

2

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

  • Абстракция означает, что вы скрыть детали реализации от кода, который использует класс или метод. Код, использующий ваш метод, не должен знать, что вы используете say, List, используя массивы или динамические указатели или встроенную базу данных или файлы в файловой системе.

  • аннотация используется для обозначения классов, которые имеют только объявленные и не реализованные методы. Это «абстрактное» в том смысле, что они не могут быть созданы, вы не можете создавать какие-либо экземпляры из этих классов (но вы можете создать их из своих конкретных подклассов).

0

Это не прячет информацию от вас, а от клиента вашей абстракции. Взгляните на этот пример.

public class Demo { 
    Client client = new Client(new Implementation()); 
} 

public interface Abtraction { 
    void doWork(); 
} 

public class Implementation implements Abtraction{ 
    @Override 
    public void doWork() { 
     //doingTheWork 
    } 
} 

public class Client{ 
    private Abtraction theAbstraction; 

    public Client(Abstraction theAbstraction){ 
     this.theAbstraction = theAbstraction; 
    } 
} 

Класс Client не знает о реализации Abstraction, это означает, что Demo класс может предоставить различные варианты реализации Abstraction не портя Client.

0

данные Скрытие в основном скрываются подробности о внутренних данных членах класса и только исключительно давая доступ заинтересованного класса к нему.

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

Таким образом, вы предоставляете аннотация внутренние детали данного вида деятельности.

1

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

Давайте возьмем машину, например:

public abstract class Vehicle { 
    protected int _numberOfWheels; 
    public Vehicle() { 
     this._numberOfWheels = 4; 
    } 
} 

public class Truck extends Vehicle { 
    public int carryingLoad; 
    public Truck() { 
     this.carryingLoad = 4000; // kg or something 
    } 
} 

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

// Inside main 
Truck truck = new Truck(); 

Я не могу изменить количество колес, тем не менее, если бы я написать функцию для грузовиков в классе, как:

// Inside the Truck class 
public void addSpareTire() { 
    this._numberOfWheels++; 
} 

Так что я мог бы назвать это нравится:

// Inside main 
truck.addSpareTire(); 

я все еще мог взаимодействовать с некоторыми переменными, но только кап функции в классе, который расширяет абстрактный класс. Я могу добавить одну шину в то время, позвонив по телефону addSpareTire(), но я никогда не мог взаимодействовать непосредственно с _numberOfWheels от основной функции, где я с помощью на Truck объект, но я могу изнутри Truckкласса декларации. Из пользователя объекта грузового автомобиля эта информация скрыта.

Я не знаю, это то, о чем вы просите. Надеюсь это поможет.

1

В объектно-ориентированном программировании Абстракция - это процесс скрытия деталей реализации от пользователя, только функциональность будет предоставлена ​​пользователю. Другими словами, пользователь будет иметь информацию о том, что делает объект, а не о том, как он это делает.

проверить следующую ссылку для получения более подробной информации: http://www.visionsdeveloper.com/tutorial/java/java-abstraction.jsp

1

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

Я думаю, вы мало смущены понятиями, которые на вашем языке дают вам Abstraction. У вас всегда есть доступ к вашему собственному коду, но такие вещи, как Abstraction или Polymorphism, дают вам идеальные способы, которыми должны быть. Итак, в Abstraction вы просто говорите, что я знаю, что будет поведение с именем someThing в качестве абстрактного метода, но прямо сейчас вы не знаете, как он будет себя вести. Разработчик расскажет нам, как это будет. См. Следующий код.

abstract class Game{ 
public abstract void play(); 
} 

class Football extends Game{ 
    @Override 
    public abstract void play(){ 
     // write how football play 
    } 
} 

class Cricket extends Game{ 
    @Override 
    public abstract void play(){ 
     // write how Cricket play 
    } 
} 

Я здесь, оставляя вопрос для вас.

Why you are making class level attributes public/protected/private although you have access to the code when you implement?

+0

Чтобы я мог контролировать его доступность. –

+0

Да, верно! даже у вас есть доступ к коду, но вы делаете, потому что доступность имеет значение :) –

1

Я думаю, что вы смущены о двух вещах

  1. Абстрактное понятие в OOps и его реализация в Java
  2. абстрактный класс в Java

  3. Аннотация: Там представляет собой концепцию ООП под названием Abstract. Здесь пользователь может захватывать необходимые функции объекта. Эта абстрактная концепция реализована как класс и объект в java. Итак, приходя к вам вопрос, скрывая данные, когда вы захватываете важные функции объекта в виде класса, эти функции доступны только для объекта своего класса. Здесь вы скрываете все функции класса вне класса/мира. Таким образом, это называется скрытием данных

  4. abstract class: Это особенность реализации Java. Если вы не знаете полной реализации, вы можете перейти к абстрактному классу java.

Надеется, что это поможет вам понять немного

Благодаря

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