Интерфейс с методами по умолчанию против абстрактного класса в Java 8

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

commandThatOutputs.exe > someFileToStoreResults.txt

или

commandThatOutputs.exe | yourProgramToProcessInput.exe

В вашей программе вы могли бы использовать стандартные функции ввода C для чтения других программ (scanf и т. Д.): http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output.asp . Вы также можете использовать пример файла и использовать fscanf. Это также должно работать в Unix / Linux.

Это очень общий вопрос, вы можете включить более подробную информацию, например, какой тип вывода (просто текст или двоичный файл?) И как вы хотите обработать его.

Edit: Hooray clarification!

Перенаправление STDOUT выглядит бесполезным, мне приходилось делать это в .NET, и это давало мне все виды головные боли. Похоже, что правильный способ C - это порождать дочерний процесс, получить указатель на файл, и внезапно у меня болит голова.

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

#include 
#include 

int main(int argc, char* argv[])
{
    FILE * fptr;                    // file holder
    char c;                         // char buffer


    system("dir >> temp.txt");      // call dir and put it's contents in a temp using redirects.
    fptr = fopen("temp.txt", "r");  // open said file for reading.
                                    // oh, and check for fptr being NULL.
    while(1){
        c = fgetc(fptr);
        if(c!= EOF)
            printf("%c", c);        // do what you need to.
        else
            break;                  // exit when you hit the end of the file.
    }
    fclose(fptr);                   // don't call this is fptr is NULL.  
    remove("temp.txt");             // clean up

    getchar();                      // stop so I can see if it worked.
}

Обязательно проверьте права на доступ к файлам: прямо сейчас это просто выкинет файл в том же каталоге, что и exe. Возможно, вы захотите изучить /tmp в nix или C:\Users\username\Local Settings\Temp в Vista или C:\Documents and Settings\username\Local Settings\Temp in 2K/XP. Я думаю, что /tmp будет работать в OSX, но я никогда не использовал его.

457
задан Ravindra babu 17 September 2016 в 18:17
поделиться

2 ответа

Хотя старый вопрос позволил мне дать свой вход на нем также.

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

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

  2. абстрактный класс: Абстрактный класс может говорить о состоянии объекта

    Интерфейс: Интерфейс никогда не может говорить о состоянии объекта

  3. абстрактный класс: Внутренний Абстрактный класс мы можем объявить конструкторов

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

  4. абстрактный класс: Внутренний абстрактный класс мы можем объявить экземпляр и статические блоки

    Интерфейс: Интерфейсы не могут иметь экземпляра и статических блоков.

  5. абстрактный класс: Абстрактный класс не может отослать лямбда-выражение

    Интерфейсы: Интерфейсы с единственным абстрактным методом могут отослать лямбда-выражение

  6. абстрактный класс : В абстрактном классе мы можем переопределить методы КЛАССА ОБЪЕКТА

    Интерфейсы: Мы не можем переопределить методы КЛАССА ОБЪЕКТА в интерфейсах.

я закончу на ноте что:

понятия понятий/статического метода метода По умолчанию в интерфейсе прибыли только, чтобы сохранить классы реализации, но не обеспечить значимую полезную реализацию. Методы/статические методы по умолчанию являются видом фиктивной реализации, "если Вы хотите Вас, может использовать их, или можно переопределить их (в случае методов по умолчанию) в классе реализации" Таким образом сохранение нас от реализации новых методов в классах реализации каждый раз, когда новые методы в интерфейсах добавляются. Поэтому интерфейсы никогда не могут быть равны абстрактным классам.

3
ответ дан 22 November 2019 в 22:43
поделиться

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

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

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

class MyObject extends String implements Runnable, Comparable { ... }

MyObject наследовал только одну реализацию, но она наследовала три контракта.

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

Для поддержки моей точки вот является кавычка от Ken Arnold и James Gosling из книги Языком программирования Java, 4-м выпуском :

Единичное наследование устраняет некоторые полезные и корректные проекты. Проблемы множественного наследования являются результатом множественного наследования реализации, но во многих случаях множественное наследование используется для наследования многих абстрактных контрактов и возможно одной конкретной реализации. Обеспечение средства наследовать абстрактный контракт, не наследовав реализацию позволяет преимущества ввода множественного наследования без проблем нескольких наследование реализации. Наследование абстрактного контракта называют интерфейсное наследование . Язык программирования Java поддерживает интерфейсное наследование, позволяя Вам объявить interface тип

0
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: