通过两个不同的接口访问同一对象

本文关键字:接口 访问 对象 两个 | 更新日期: 2023-09-27 17:59:32

我有两个接口:

interface IStudent
{
    string Name { get; }
    string EducationLevel { get; }
}
interface ITeacher
{
    string Name { get; }
    string Department { get; }
}

你会如何在C#中设计它,使一个对象可以

  1. 仅实现学生(不具有教师的属性)
  2. 仅实现Teacher(并且不具有strudent的属性)
  3. 在不冗余公共属性(名称)的情况下实现这两个接口

有什么想法吗?

我可以做两个类来直接实现这两个接口。但对于一个既是老师又是学生的人来说,我将有两个不同的目标:我只想要一个!

通过两个不同的接口访问同一对象

我将提取一个通用接口:

interface IPerson
{
    string Name { get; }
}
interface IStudent : IPerson
{
    string EducationLevel { get; }
}
interface ITeacher : IPerson
{
    string Department { get; }
}

思考一下为什么您的两个接口具有相同的属性。他们都有名字,为什么他们有名字?因为他们都是一个人。这样你就有了通用界面。

实现两个接口的类只需要实现Name一次,因为它是IPerson的一部分。

以下内容完全合法:

public class LearningTeacher : ITeacher, IStudent
{
    public string EducationLevel
    {
        get { return /*...*/; }
    }
    public string Department
    {
        get { return /*...*/; }
    }
    public string Name
    {
        get { return /*...*/; }
    }
}

Name属性是ITeacher.NameIStudent.Name的实现。

如果属性在StudentLearningTeacher中的实现相同,则可以使LearningTeacher在内部具有Student实例和Teacher实例,从而使其有效地成为装饰器。像这样,您不必重复实现:

public class LearningTeacher : ITeacher, IStudent
{
    Teacher _teacher;
    Student _student;
    public LearningTeacher(string name, string educationalLevel,
                           string department)
    {
        _student = new Student(name, educationalLevel);
        _teacher = new Teacher(name, department);
    }
    public string EducationLevel
    {
        get { return _student.EducationLevel; }
    }
    public string Department
    {
        get { return _teacher.Department; }
    }
    public string Name
    {
        get { return _student.Name; }
    }
}

这是唯一的方法,因为.NET不支持多重继承。您只能实现多个接口。

怎么样,

interface IPerson
{
    string Name { get; }
}
interface IStudent : IPerson
{
    string EducationLevel { get; }
}
interface ITeacher : IPerson
{
    string Department { get; }
}

你可以在这样的实现中使用这些接口,

abstract class Person : IPerson
{
    public virtual string Name { get; set; }
}
class Student : Person, IStudent
{
    public string EducationLevel { get; set; }
}
class Teacher : Person, ITeacher
{
    public string Department { get; set; }
}
class StudentTeacher : Person, IStudent, ITeacher
{
    public string EducationLevel { get; set; }
    public string Department { get; set; }
}
interface IPerson
{
    string Name { get; }
}
interface IStudent : IPerson
{
    string EducationLevel { get; }
}
interface ITeacher : IPerson
{
    string Department { get; }
}
IPerson P1 = SomeStudent;
IPerson P2 = SomeTeacher;
IStudent S = P1 as IStudent;
ITeacher T = P2 as ITeacher;

这个实现适合您吗?

interface IStudent
{
    string Name { get; }
    string EducationLevel { get; }
}
interface ITeacher
{
    string Name { get; }
    string Department { get; }
}
public class Person: IStudent, ITeacher
{
    public string EducationLevel
    {
        get { return String.Empty; }
    }
    public string Name
    {
        get { return String.Empty; }
    }
    public string Department
    {
        get { return String.Empty; }
    }
}

我们能否不是从本体论而是从认识论来区分这些实体,即通过它们各自的思维行为模式来区分它们?

interface IPerson
{
    string Name { get; }
}

 interface ILearn
{
    Learn(  EducationLevel )
}
interface ITeach
{
      Teach(  Department  )
}