Скажем, у меня есть класс Book
:Как определить подпись функции, которая должна быть реализована экземплярами класса?
public class Book{
public string Title {get; set;}
}
Я хочу, чтобы каждая книга, чтобы иметь Read
функцию, которая возвращает строку и принимает номер страницы - но внутренности будут различны для каждой книги (плохой пример, я знаю). Как определить подпись функции, которая должна быть реализована экземплярами этого класса?
Что-то вроде этого:
public class Book{ // need to make this abstract?
public string Title {get; set;}
public abstract string Read(int pageNum);
}
// I want to define instances that define their own behavior...
public static Book It => new Book(){ // can't create instance of abstract...
Title = "It",
Read... // what do I do here?
}
Мои основные проблемы являются:
- Сохраняя вещи настолько простыми, насколько это возможно. Реализация интерфейсов в абстрактных классах работает, но это вызывает у меня проблемы с n * 2, поскольку я добавляю больше экземпляров.
- Мне нужно будет добавить большое количество этих пользовательских функций - передача Funcs через конструкторы кажется громоздкой.
- На практике - это используется для определения
Tenant
.Tenants
определены в памяти, и имеет множество статических свойств какdomain
,name
,adminEmail
и т.д. Это наниматель специфических свойства ... но теперь я пытаюсь реализовать жилец конкретного поведения - какGetBooks
илиFilterUsers
. Я бы хотел, чтобы реализация была настолько простой, насколько это было возможно по-человечески. Прямо сейчас у меня есть «Если TenantA, сделайте это, иначе, если tenantB, сделайте это ...», посыпанный по всему моему коду. Я пытаюсь консолидировать всю конкретную логику и детальную информацию в одном месте - на примерах классаTenant
. - Другие примеры специфического поведения Арендатора - у вас есть программное обеспечение форума SaaS. На домашней странице форума A вы найдете
GetCoverPhoto
, прочитав статический файл. На домашней странице Форума B вы найдетеGetCoverPhoto
, прочитав домашнюю страницу блога. В настоящее время я говорю: «Если форум А, сделай это, иначе, если форум В, сделай это». Это тип специфического для арендатора поведения, которое я хочу определить на объекте Tenant, а не в коде. В моей основной логике я не хочу использовать какой-либо код, специфичный для арендатора.
Есть ли простая функция/шаблон на языке C#, который достигнет этого?
@AlexD Я пробовал это - я обновлю вопрос, где я боюсь. – SB2055
Ах, ОК, 'abstract' здесь не применяется. Вы можете подумать о том, чтобы сделать 'Read' делегатом. – AlexD
«Прохождение Funcs через конструкторы кажется громоздким» Действительно? 'Read = pageNumber => LoadPage (pageNumber)' неудобен? В нем точно указано, что вам нужно сказать: для этого экземпляра «Книга» вы загружаете страницу, вызывая метод LoadPage. Способ указания различного поведения чтения для каждого экземпляра книги заключается в том, чтобы * указать другое поведение чтения для каждого экземпляра книги. * –