У меня есть ситуация, когда у меня есть 2 Activity
объекты (скажем, пустые и запланированные действия, не контролируемые мной), которые разделяют несколько видов поведения, например, человек, который забронировал мероприятие, комната, где происходит это действие, вид деятельности, предмет и т. д.
Я создал два объекта-оболочки (EmptyWrapper
и ScheduledWrapper
), которые имеют суперкласс ActivityWrapper
, который реализует некоторые методы, общие для обоих дочерних объектов, и имеет некоторые абстрактные методы / свойствадля детской оболочки, чтобы ответить соответственно.Они очень похожи по поведению, но есть одно существенное отличие: вы можете планировать действия, только если это пустое место!Структура выглядит примерно так (очень упрощенный код):
public class EmptyWrapper : AppWrapper
{
EmptySlot _emptySlot;
public EmptySlotWrapper(EmptySlot emptySlot) : base()
{
this._emptySlot = emptySlot;
}
public override string Id
{
get { return _emptySlot.AgendaId; }
}
public override string Room;
{
get{ return _emptySlot.Room;}
}
public override string Person
{
get{ return _emptySlot.Person;}
}
public override string AppType;
{
get{ return "Empty";}
}
public override bool IsAppSlot()
{
return false;
}
public override bool IsEmptySlot()
{
return true;
}
public override bool CanPerformOperations()
{
return true;
}
public void ReserveApp(ObjWithActivityInfo actObj)
{
(...)
}
}
ActivityWrapper
похож, но объект обтекания отличается, bools возвращает true для IsAppSlot
, false для IsEmptySlot
иfalse для CanPerformOperations
, и ReserveApp()
метод отсутствует.
Следующий базовый класс:
public abstract class AppWrapper
{
public abstract string Collaborator { get; }
public abstract string Room { get; }
public abstract string AppType { get;}
public AppWrapper()
{ }
public abstract bool IsAppSlot();
public abstract bool IsEmptySlot();
public abstract bool CanPerformOperations();
public virtual string GetTextToShow()
{
return Person + " - " + Room;
}
(...)
}
В моем коде я хотел сослаться только на ActivityWrapper
, потому что дляобщие операции (показать информацию и внешний вид) мне не нужны реализации.Проблема возникает, когда мне нужно забронировать деятельность для пустых слотов.В этом пункте в моем коде я преобразую AppointmentWrapper
в EmptyWrapper
и резервирую слот для действия (это все еще EmptySlot
, но оно зарезервировано для выбранного действия), в противном случае, если приведение было неудачнымЯ ничего не делаю, потому что это был неправильный Activity
тип.
Это правильно, или я должен реализовать метод ReserveActivity()
в обеих оболочках и иметь ActivityWrapper
ничего не делать?
Или я должен сделать это по-другому?Может быть, изменить структуру классов?
Извините за длинный текст.