首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个实体都实现了接口?

每个实体都实现了接口?
EN

Stack Overflow用户
提问于 2016-11-03 18:04:51
回答 4查看 995关注 0票数 1

目前,我正在从事应用程序架构的工作,我在我的项目中有许多实体,即学生师范大学,我想知道所有实体都必须实现接口是不是一个好的做法。这对我的依赖注入有帮助吗?从架构的角度来看,最佳实践是什么?

代码语言:javascript
复制
 public interface IMyEntity
    {
          //an empty interface
    }
public class Student:IMyEntity
{

}
public class Teacher:IMyEntity
{

}

//hi我可以处理实现IMyEntity的每个对象

代码语言:javascript
复制
void Display(IMyEntity entity) //this function can be in some class
{
    // if IMyEntity is teacher behave like a teacher
    // if IMyEntity is student behave like sutdent
}

我知道接口是一种契约,但从架构的角度来看,这是最佳实践吗?我知道我的IMyEntity接口是空的。

EN

回答 4

Stack Overflow用户

发布于 2016-11-03 18:13:45

不一定。如果在这种情况下,学生和教师有一些共同的功能,那么共享界面将是一种方法。

代码语言:javascript
复制
public void Display(IUniPerson person)
{
    var name = person.Name; // Everyone, student or teacher, has a name
    ...
}

但是,您给出的示例似乎表明事实并非如此,Display方法将尝试根据传入的IMyEntity实例的类型对其进行不同的处理。在这种情况下,使用两种具有不同参数的显示方法可能会更好。

代码语言:javascript
复制
public void Display(ITeacher teacher) { // teacher processing }
public void Display(IStudent student) { // student processing }

tl:dr版本:跨多个类实现一个接口,如果这些类实现相关的方法和函数是有意义的,而不是仅仅作为一个综合规则。

票数 0
EN

Stack Overflow用户

发布于 2016-11-03 18:21:03

我认为从开发的角度来看,解耦2个或更多的类是一种很好的体验,而且它确实有助于长期维护代码

考虑以下场景:

代码语言:javascript
复制
static void Main(string[] args)
{
    var objA = new A();
    var objB = new B(objA);
}

public class A {}

public class B 
{
  public B(A obj)
  {
    //Logic Here
  }
}

这段代码的问题是,它是强耦合的,类B需要A类被实例化,并执行它的业务。

如果你确定B永远不会有戏剧性的变化,这不是问题。

现在,如果我们想要将其解耦,我们可以进行第一次改进,实现如下接口

代码语言:javascript
复制
static void Main(string[] args)
{
    var objA = new A();
    var objB = new B(objA);
}

public interface IA()
{
    //TODO
}

public class A : IA {}

public class B 
{
  public B(IA obj)
  {
    //Logic Here
  }
}

这看起来很好,我们仍然有一个主要的耦合问题,所以在这一点上,我们将不得不实现一个像这样的IOC依赖注入,我们的代码将类似于:

代码语言:javascript
复制
static void Main(string[] args)
{
    var objB = new B();
}

public interface IA()
{
    //TODO
}

public class A : IA {}

public class B 
{
  public B(IA obj)
  {
    //Logic Here
  }
}

是的,看起来不错。我们已经完全消除了耦合的问题,如果在未来我们只需要取A,删除它,并用一些新的更酷的东西来替换它,这将是非常容易的。

显然,过度夸大了这是一种糟糕的做法,和我相信DI必须在仔细计划之后才能使用,以避免无用的实现。

例如,如果我有一个C类,它有一些基本的操作,我确信它永远不会改变,或者有一些戏剧性的更新需求,我可以避免DI。

那么,您是否必须在项目中的每个模型上实现接口?

我不认为你的项目中的每个模型都需要实现一个接口或DI,只要考虑一下,看看在哪里是有用的,在哪里只是夸大了

票数 0
EN

Stack Overflow用户

发布于 2016-11-03 18:34:50

是的,像这样做,这是最好的做法。这为您提供了多态性的优势。你应该在当前上下文中以更好的方式来做这件事,因为Student不是一个Teacher。如果你想共享公共接口,你应该把它定义为:IUniversityMember。这里有一个你的案例的例子,我想它会让你明白。

代码语言:javascript
复制
public interface IUniversityMember
{
   //... here common fields between `Teacher` and `Student`
   string Name{ get; set;}
   string Gender { get; set;}
}

//after that

public interface IStudent
{
    int GetGPA();
    int CreditsToPass {get; private set;}
}

public interface ITeacher
{
   int WorkedHours {get; set;}
   decimal PayPerHour {get; private set;}
}

public class BiologicalStudent: IUniversityMember, IStudent
{
    public int CreditsToPast {get; private set;}

    public BiologicalStudent ()
    {
        CreditsToPast  = 5;
    }
    //stuff
    public int GetGPA()
    {
        return 3;
    }
}

public class MathStudent: IUniversityMember, IStudent
{
    public int CreditsToPast {get; private set;}

    public BiologicalStudent ()
    {
        CreditsToPast  = 9;
    }

    public int GetGPA()
    {
        return 2;
    }
}

public class BiologicalTeacher: IUniversityMember, ITeacher
{
     public int WorkedHours { get; set;}
     public decimal PayPerHour {get; private set;}

     public MathTeacher()
     {
         PayPerHour = 8;

     }
}

public class MathTeacher: IUniversityMember, ITeacher
{
     public int WorkedHours { get; set;}
     public decimal PayPerHour {get; private set;}

     public MathTeacher()
     {
         PayPerHour = 10;

     }
}
//Now if you have a university class

public class OxfordUniversity:IUniversity //can inherit interface too
{
     public int MinGAPForSchollarship {get; private set;}

     public OxfordUniversity()
     {
         MinGAPForSchollarship = 3;
     }

     public decimal PaySallary(ITeacher teacher)
     {
          return teacher.WorkedHours*teacher.PayPerHour;
     }

     public bool CheckForSchollarship(IStudent student)
     {
         int gpa = student.GetGPA();
         //do some checks

         if(gpa >= MinGAPForSchollarship)
            return true;

         return false;
     }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40398691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档