Как я могу поручить один класс будет держать один тип внутреннего объекта - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть требование, как от объектов другого типа, которые мне нужны для создания объекта AlertModelWrapper. Для этого я могу передать ученика только в StudentAlertGenerator, а учителя - только в TeacherAlertGenerator. Каким должен быть метод интерфейса здесь? Если я беру объект, я не могу поручить ученику иметь только студенческий тип. Где мой дизайн отстает?

public class StudentAlertGenerator : IAlertGeneratorType
{
  private readonly IDateTransformationService transformationService
  public StudentAlertGenerator(IDateTransformationService transformationService)
  {
     this.trnasformationservice =transformationservice
  }
  public AlertModelWrapper CreateAlertTypeModel(Student student)
  {
    return new AlertModelWrapper ()
    {
        ID= "std_"+student.Id,
        AlertModel = new AlertModel () { alertDetails=student.Name + "has an alert on " +transformationService.Transform(DateTime.Now())}
    };
  }
}

и учитель оповещает генераторов следующим образом

public class TeacherAlertGenerator : IAlertGeneratorType
{
  private readonly IDateTransformationService transformationService
  public StudentAlertGenerator(IDateTransformationService transformationService)
  {
     this.trnasformationservice =transformationservice
  }
  public AlertModelWrapper CreateAlertTypeModel(Teacher teacher)
  {
    return new AlertModelWrapper ()
    {
        ID= "tea_"+teacher.Id,
        AlertModel = new AlertModel () { alertDetails=teacher.Name + "has an alert on " +transformationService.Transform(DateTime.Now())}
    };
  }
}

---- Редактировать ---- Мои основные требования c Мне нужно позвонить в итератор

List<IAlertGeneratorType> alerts=DecissionEngine.GetAlerts();
foreach(var alert in alerts)
{
   //make object x from decission engine response(it will tell what type of object and id)
   //api push on alert.CreateAlertTypeModel(x);
}

Здесь я должен быть в состоянии передать х. Но типа х я сейчас не знаю. Так каким должен быть мой интерфейс? Или это проблема дизайна?

1 Ответ

0 голосов
/ 30 апреля 2020

Если я вас правильно понял, вы хотите объявить метод интерфейса, который может работать с классами Student и Teacher.

Для этого вы можете создать интерфейс - например, IPerson - со свойствами Id и Name:

public interface IPerson
{
     int Id {get;set;}
     string Name {get;set;}
}

Затем вы должны реализовать этот интерфейс с вашими классами:

public class Student: IPerson
public class Teacher: IPerson

После этого вы можете изменить тип параметра в вашем методе:

public interface IAlertGeneratorType
{
    public AlertModelWrapper CreateAlertTypeModel(IPerson person);
}

Этот метод будет работать с обоими занятий: ученик и учитель

public class AlertGenerator : IAlertGeneratorType
{
  private readonly IDateTransformationService transformationService
  public StudentAlertGenerator(IDateTransformationService transformationService)
  {
     this.trnasformationservice =transformationservice
  }
  public AlertModelWrapper CreateAlertTypeModel(IPerson person)
  {
    return new AlertModelWrapper ()
    {
        ID= "tea_"+person.Id,
        AlertModel = new AlertModel () { alertDetails=person.Name + "has an alert on " +transformationService.Transform(DateTime.Now())}
    };
  }
}

Пример:

   var generator = new AlertGenerator();
    var teacher = new Teacher();
    var student = new Student();
    generator.CreateAlertTypeModel(teacher);
    generator.CreateAlertTypeModel(student);
...