Size: a a a

2019 November 28

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Давайте как раз на тему ООП подкину вопросик. Нужно реализовать класс отчётов. Даты начала/конца, название, данные. И у некоторых отчётов будет ещё булево поле использовать ли смежные данные.
Вот отчеты с булевым полем должны его иметь, а без него, по-хорошему, вообще не должны о нем знать.
У нас две идеи: Основной отчет и подкласс с булевым полем, либо оба отчета в виде интерфейсов с повторяющимися полями, класс реализует оба интерфейса, а используется как интерфейсный тип по ситуации.
Ни один вариант особо не нравится. Идеи будут?
Интерфейс может наследоваться от интерфейса, используй это.
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Давайте как раз на тему ООП подкину вопросик. Нужно реализовать класс отчётов. Даты начала/конца, название, данные. И у некоторых отчётов будет ещё булево поле использовать ли смежные данные.
Вот отчеты с булевым полем должны его иметь, а без него, по-хорошему, вообще не должны о нем знать.
У нас две идеи: Основной отчет и подкласс с булевым полем, либо оба отчета в виде интерфейсов с повторяющимися полями, класс реализует оба интерфейса, а используется как интерфейсный тип по ситуации.
Ни один вариант особо не нравится. Идеи будут?
И использовать интерфейсный тип, либо простой, либо расширенный, если он им является
источник

SB

Sergey Benzenko in CODE BLOG / C#
Egene Avdeev
Использовать базовый класс без поля bool ReportBase. Отдельно интерфейс для отчёта IReport и наследуемый от него расширенный интерфейс IReportExtended. Базовый класс наследуется от IReport.

В итоге пользуешь только IReport который просто отчёт, но можешь проверять
report is IReportExtended
Да, вот тоже что-то такое и придумал. А если класс реализует только унаследованный IReportExtended, его ведь можно привести к IReport или надо чтобы он реализовывал оба интерфейса?
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Да, вот тоже что-то такое и придумал. А если класс реализует только унаследованный IReportExtended, его ведь можно привести к IReport или надо чтобы он реализовывал оба интерфейса?
При объявлении
interface IReportExtended : IReport

При пользовании
class MyCustomReport : IReportExtended
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Да, вот тоже что-то такое и придумал. А если класс реализует только унаследованный IReportExtended, его ведь можно привести к IReport или надо чтобы он реализовывал оба интерфейса?
Класс уже реализует IReport
источник

SB

Sergey Benzenko in CODE BLOG / C#
Egene Avdeev
При объявлении
interface IReportExtended : IReport

При пользовании
class MyCustomReport : IReportExtended
Да, то есть я могу сделать так?
var report =  (IReport) new MyCustomReport();
источник

SB

Sergey Benzenko in CODE BLOG / C#
Или надо, чтобы оба были?
class MyCustomReport : IReportExtended, IReport
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Да, то есть я могу сделать так?
var report =  (IReport) new MyCustomReport();
Ну да, только наверное через as
источник

SB

Sergey Benzenko in CODE BLOG / C#
Egene Avdeev
Ну да, только наверное через as
ОК. Спасибо
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Или надо, чтобы оба были?
class MyCustomReport : IReportExtended, IReport
Оба не надо
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Или надо, чтобы оба были?
class MyCustomReport : IReportExtended, IReport
Только расширенный, а базовый автоматически
источник

EA

Egene Avdeev in CODE BLOG / C#
Sergey Benzenko
Или надо, чтобы оба были?
class MyCustomReport : IReportExtended, IReport
4 свойства в IReport, 1 свойство в IReportExtended и получается 5 свойств в классе
источник

SB

Sergey Benzenko in CODE BLOG / C#
Egene Avdeev
4 свойства в IReport, 1 свойство в IReportExtended и получается 5 свойств в классе
Ну да
источник

Y

Yasik in CODE BLOG / C#
А это разве не нарушит принцип разделения интерфейса
источник

Y

Yasik in CODE BLOG / C#
По сути класс всегда реализует расширеный отчет, но при этом не всегда им является
источник

Y

Yasik in CODE BLOG / C#
Что если оставить эти же интерфейсы, но создать класс обычного отчета и реализовать интерфейс IReport
И создать класс расширенного отчета и унаследоваться от базового и реализовать IReportExtended
источник

SB

Sergey Benzenko in CODE BLOG / C#
Yasik
По сути класс всегда реализует расширеный отчет, но при этом не всегда им является
Главное, чтоб пользователи, принимающие IReport не видели лишнего поля
источник

EA

Egene Avdeev in CODE BLOG / C#
Yasik
Что если оставить эти же интерфейсы, но создать класс обычного отчета и реализовать интерфейс IReport
И создать класс расширенного отчета и унаследоваться от базового и реализовать IReportExtended
Так и подразумевается, и в идеале через фабрику возвращать IReport, а является или не является он Extended, решается на моменте создания, опять же в фабрике
источник

GK

Gennady Kurbesov in CODE BLOG / C#
var frm2 = new Form2();
frm2.Show();
this.Hide();
источник

А

Анна in CODE BLOG / C#
а hide для чего
источник