#c# #generics #interface
#c# #общие положения #интерфейс
Вопрос:
public interface IAutomatizableEvent
{
Event AutomatizableEventItem { get; }
bool CanBeAutomatic { get; }
bool IsAutomaticallyRunning { get; }
bool OnBeforeAutomaticCall();
bool OnAutomaticCheck();
void OnAutomaticStart();
void OnAutomaticCancel();
}
public abstract class AutomatizableEvent : IAutomatizableEvent
{
public AutomatizableEvent()
{
}
#region Implementation of IAutomatizableEvent
public abstract Event AutomatizableEventItem { get; }
public abstract bool CanBeAutomatic { get; }
public abstract bool IsAutomaticallyRunning { get; }
public abstract bool OnBeforeAutomaticCall();
public abstract bool OnAutomaticCheck();
public abstract void OnAutomaticStart();
public abstract void OnAutomaticCancel();
#endregion
}
public static class EventSystem
{
public static List<EventSystemBase<Event, AutomatizableEvent>> AutomatizableEvents { get; set; }
[...]
}
«Тип ‘AutomatizableEvent’ должен иметь общедоступный конструктор без параметров, чтобы использовать его в качестве параметра ‘K’ в универсальном классе ‘EventSystemBase'»
public abstract class EventSystemBase<T, K> : AutomatizableEvent
where T : Event
where K : AutomatizableEvent, new()
Мой вопрос таков… разве у AutomatizableEvent НЕТ общедоступного конструктора без параметров??
Комментарии:
1. Чтобы удовлетворить
new()
ограничению, вы должны иметь возможность инициализировать класс, с помощью=new AutomatizableEvent()
которого вы не можете, поскольку он абстрактен. Создайте конкретный дочерний класс и используйте его вместо этого.
Ответ №1:
Описание ошибки неверно, но сама ошибка верна.
AutomatizableEvent
не может использоваться в качестве универсального параметра K
из-за ограничения where K : new()
. Абстрактный класс не удовлетворяет этому ограничению.
Конструктор абстрактного класса эффективно защищен всегда, поскольку аннотация может быть создана только как базовый подобъект производного класса, конструктор также может быть вызван только конструктором производного класса и только в цепочке конструкторов. В частности, он не может быть использован EventSystemBase<T, K>
в контексте new K()
.
Ответ №2:
вы не можете создать экземпляр абстрактного класса