通过两个不同的接口访问同一对象
本文关键字:接口 访问 对象 两个 | 更新日期: 2023-09-27 17:59:32
我有两个接口:
interface IStudent
{
string Name { get; }
string EducationLevel { get; }
}
interface ITeacher
{
string Name { get; }
string Department { get; }
}
你会如何在C#中设计它,使一个对象可以
- 仅实现学生(不具有教师的属性)
- 仅实现Teacher(并且不具有strudent的属性)
- 在不冗余公共属性(名称)的情况下实现这两个接口
有什么想法吗?
我可以做两个类来直接实现这两个接口。但对于一个既是老师又是学生的人来说,我将有两个不同的目标:我只想要一个!
我将提取一个通用接口:
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.Name
和IStudent.Name
的实现。
如果属性在Student
和LearningTeacher
中的实现相同,则可以使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 )
}