2013-02-14 3 views
2

У меня есть два интерфейса:Доступ тот же объект в течение двух различных интерфейсов

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

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

Как бы вы его дизайн в C#, так что объект может

  1. осуществлять только студент (и не имеют свойства учителя)
  2. применять только Учитель (и не имеют свойств страдента)
  3. реализовать оба интерфейса без избыточности свойств цели (имя)

Любые мысли?

Я могу сделать 2 класса, реализующих непосредственно два интерфейса. Но для человека, являющегося как учителем, так и учеником, у меня будет два разных объекта: я хочу только одного!

+1

Не существует «избыточности общих свойств». Если свойства имеют одну и ту же подпись, они могут совместно использовать общую реализацию - по сути, это значение по умолчанию. (В C# вы также можете использовать явную реализацию интерфейса, чтобы дать двум свойствам разные реализации.) – millimoose

ответ

3

Следующая совершенно законно:

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 не поддерживает множественное наследование. Вы можете реализовать только несколько интерфейсов.

+0

Привет, я не хочу этого, потому что вы собираетесь нужен другой класс. Студент: IStudent, и это приведет к дублированию кода с классом LearningTeacher – Toto

+0

@ user2071634: Какой код будет дублироваться здесь? –

+0

Я не хочу, чтобы «нормальный» ученик реализовал ITeacher. Таким образом, вам нужна реализация IStudent. Эта реализация будет одинаковой для LearningTeacher и Student, но в двух разных классах. Я чист ? – Toto

5

Я бы извлечь общий интерфейс:

interface IPerson 
{ 
    string Name { get; } 
} 

interface IStudent : IPerson 
{ 
    string EducationLevel { get; } 
} 

interface ITeacher : IPerson 
{ 
    string Department { get; } 
} 

Подумайте о том, почему ваши два интерфейса имеют одинаковые свойства. У них обоих есть имя, и почему у них есть имя? Потому что они оба - человек. Итак, у вас есть общий интерфейс.

Классы, реализующие оба интерфейса, должны будут реализовать только Name, потому что это часть IPerson.

+0

Привет, я не хочу этого, потому что учитель, являющийся также учеником, будет представлен как 2 разных объекта. – Toto

+0

Является ли сущность с двойной идентичностью учеником-учителем или учителем, работающим на магистерской степени? :-) – Tim

+0

«Классы, реализующие оба интерфейса, должны будут только реализовать Имя один раз, потому что это часть IPerson». - То же самое верно, если вы не извлекаете общий интерфейс. Вам все равно придется реализовать 'Name' только один раз, см. Мой ответ. –

0
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; 
+0

Привет, я не хочу этого, потому что учитель, являющийся также учеником, будет представлен как 2 разных объекта. – Toto

+0

Предполагая, что это домашнее задание - я думаю, вы неправильно поняли инструкции. То, что вас попросили, - иметь объект, который является только учителем или только учеником, в то время как у него нет учителя и ученика, оба реализуют 'name' – PhonicUK

0

Эта реализация подходит вам?

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

} 
+0

Привет, я не хочу этого, потому что у ученика будет свойство отдела. – Toto

1

Как насчет

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; } 
} 
+0

Привет, я не хочу этого, потому что учитель, являющийся также учеником, будет представлен как 2 разных предмета. – Toto

+0

@ user2071634 Я расширил ответ, чтобы вы могли видеть, как интерфейсы могут использоваться в реализациях – Jodrell

0

Можно ли выделить эти объекты не онтологически, а гносеологически, т.е. их соответствующие способы мышления-поведения?

interface IPerson 
{ 
    string Name { get; } 

} 


interface ILearn 
{ 
    Learn( EducationLevel) 

} 

interface ITeach 

{ 
     Teach( Department ) 

} 
Смежные вопросы