Абстрактный класс со всеми конкретными методами

const char* text_char = "example of mbstowcs";
size_t length = strlen(text_char );

Пример использования «mbstowcs»

std::wstring text_wchar(length, L'#');

//#pragma warning (disable : 4996)
// Or add to the preprocessor: _CRT_SECURE_NO_WARNINGS
mbstowcs(&text_wchar[0], text_char , length);

Пример использования «mbstowcs_s»

Microsoft предложите использовать «mbstowcs_s» вместо «mbstowcs».

Ссылки:

Пример Mbstowcs

mbstowcs_s, _mbstowcs_s_l

wchar_t text_wchar[30];

mbstowcs_s(&length, text_wchar, text_char, length);
16
задан Saravanan M 12 December 2008 в 10:44
поделиться

7 ответов

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

(И да, мне не нравится шаблонный шаблон метода;))

15
ответ дан Cam 12 December 2008 в 10:44
поделиться

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

5
ответ дан andHapp 12 December 2008 в 10:44
поделиться

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

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

4
ответ дан lithander 12 December 2008 в 10:44
поделиться

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

public interface Foo {
    public void bar();
}
public abstract class FooDecorator implements Foo {
    private final Foo wrapped;
    public FooDecorator(Foo wrapped) { this.wrapped = wrapped; }
    public void bar() { wrapped.bar(); }
}
public class TracingFoo extends FooDecorator {
    //Omitting constructor code...
    public void bar() {
        log("Entering bar()");
        super.bar();
        log("Exiting bar()");
    }
}

, Хотя я действительно не вижу necessarity для объявления FooDecorator как краткого обзора (неабстрактный пример: HttpServletRequestWrapper).

2
ответ дан Markus 12 December 2008 в 10:44
поделиться

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

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

2
ответ дан joel.neely 12 December 2008 в 10:44
поделиться

Когда у Вас есть важный класс, но система не может создать экземпляр fo этот класс, потому что

  • этот класс является родителем большого количества классов системы;
  • это несет большую ответственность (методы, используемые большим количеством класса) для домена, требует;
  • этот класс не представляет конкретный объект;
0
ответ дан Cam 12 December 2008 в 10:44
поделиться

Хороший вопрос:)

Одна вещь наверняка..., это, конечно, возможно. Шаблонное предложение krosenvold является одним серьезным основанием для того, чтобы сделать это.

я просто хочу сказать, что класс не должен быть объявлен abstract только для предотвращения, это - инстанцирование.

Это отнесено в Разделе Спецификации языка Java 8.1.1.1

0
ответ дан bruno conde 12 December 2008 в 10:44
поделиться
Другие вопросы по тегам:

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