【问题标题】:How can I mandate one class will hold One type of inner object我怎样才能强制一个类将持有一种类型的内部对象
【发布时间】:2020-04-30 04:31:13
【问题描述】:

我需要从不同类型的对象中创建 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())}
    };
  }
}

和老师alertGenerator如下

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())}
    };
  }
}

----编辑---- 我的基本要求是我需要在迭代器中调用它

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);
}

在这里我应该可以通过 x。但是x的类型我现在不知道。那么我的界面应该是什么?还是这是设计问题?

【问题讨论】:

  • 如果您不知道自己有什么问题,那么帮不了您。无法通过查看代码(至少看起来正确)来了解您希望此代码的外观。请edit 发帖说明您想要实现的目标。
  • @AlexeiLevenkov 我的英语可能有点糟糕......对不起。我的查询是这里的接口 IAlertGeneratorType 应该是什么?我需要在调用 IAlertGeneratorType.CreateAlertTypeModel() 的迭代器中使用它

标签: c# oop design-patterns


【解决方案1】:

如果我理解正确,您想声明可以与学生和教师类一起使用的接口方法。

为此,您可以使用属性 Id 和名称创建接口 - 例如 IPerson:

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);

【讨论】:

  • 感谢您的努力。这是正常的实现方式。我的情况有点不同。我有一个迭代器,它将调用 webapi 来推送警报。那部分工作正常。它需要一个警报列表来生成我将拥有一个异构数据对象。一个可以上学,第二个可以老师,第三个可以学生。我有一个决策引擎,它将生成要生成的所有警报。上面的 TeacherAlertGenerator、StudentAlertGenerator 是该引擎的输出。每个人都有责任对其特定类型发出警报。进一步的迭代器应该小心
  • 很难理解。也许您在寻找它的织物图案是什么?
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多