2015-11-29 11 views
1

В соответствии с определением абстракция скрывает детали реализации и раскрывает только функциональность. Но точно, что, где и какую часть мы скрываем?Как мы достигаем абстракции в java?

AFAIK следующей программы является примером абстракции:

public interface ToBeImplemented { 

    public string doThis(); 
} 

public class Myclass implements ToBeImplemented { 

@override 
public string doThis() { 

//Implementation 

return null; 
} 
} 

Если я не прав, и это не абстракция, то, что является правильным примером абстракции?

+1

Это один из способов мышления об абстракции. Не неправильно; не все есть. – duffymo

+0

@duffymo вы можете помочь мне понять, что еще включено в абстракцию? – aspan88

+2

Google не установлен на вашем компьютере? Что вы читали? Какие исследования вы сделали? – duffymo

ответ

1

В приведенном выше примере вы можете написать что-то вроде этого:

public interface ToBeImplemented { 

    public string doThis(); 
} 

public class ImplementationA implements ToBeImplemented { 

    @override 
    public string doThis() { 

    //ImplementationA of doThis 

    return null; 
    } 
} 

public class ImplementationB implements ToBeImplemented { 

    @override 
    public string doThis() { 

     //ImplementationB of doThis 

     return null; 
    } 

}

Тогда вы можете иметь еще один класс, и основной метод, например:

class SomeClass{ 

    public static void main(String[] args) { 

     ToBeImplemented someImplementation; 

     //now you can pick an implementation, based on user input for example 
     if (userInput == something) 
      someImplementation = new ImplementationA(); 
     else 
      someImplementation = new ImplementationB(); 

     //do some staff 

     //Regardless of the user input, main method only knows about the 
     //abstract "ToBeImplemented", and so calls the .doThis() method of it 
     //and the right method gets called based on the user input. 
     someImplementaion.doThis(); 
     //at That 

    } 

} 

Абстракции заключается в том, что вы можете объявить ссылку ToBeImplemented, а затем назначить ей либо реализациюA, либо реализациюB (и, возможно, любую другую реализацию). Но вы пишете свой код против абстрактного ToBeImplemented, и пусть некоторые условия решат, какая должна быть правильная реализация ToBeImplemented (и, как результат doThis()).

2

Правильное определение абстракции. И код, который вы предоставили, определенно является формой абстракции.

Почему?

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

Например:

public interface myInterface{ 
public int sumTo(n); 
} 

public class myClass implements myInterface{ 
public int sumTo(int n){ 
    int sum=0; 
    for(int i=0; i<=n; i++){ 
    sum+=i; 
    } 
    return sum; 
} 
} 

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

0

Википедия является хорошим местом для начала обучения: Abstraction (computer science)

Суть абстракций сохранения информации, которая имеет отношение в данном контексте, и забывая о том, что информация не имеет отношения в этом контексте.

Джон В. Гуттаг

Разделительная интерфейс от реализации является один способ обеспечить абстракции.

Collections framework in Java - отличный пример. Вызов приложений работает с переменными (ссылками), объявленными как интерфейс, такими как List или Map, в то время как фактический объект в игре действительно представляет собой конкретный класс, такой как ArrayList или HashMap.

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

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

+0

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