2

私は2つのインターフェースを持っています:

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

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

オブジェクトができるようにC#でどのように設計しますか

  1. Student のみを実装します (教師のプロパティはありません)。
  2. Teacher のみを実装します (strudent のプロパティはありません)
  3. 共通プロパティ (名前) の冗長性なしで両方のインターフェイスを実装する

何か考えはありますか?

2 つのインターフェイスを直接実装する 2 つのクラスを実行できます。しかし、教師と生徒の両方である人のために、私は2つの異なるオブジェクトを持つつもりです.1つだけが欲しいです!

4

6 に答える 6

5

一般的なインターフェイスを抽出します。

interface IPerson
{
    string Name { get; }
}

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

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

2 つのインターフェイスが同じプロパティを持っている理由を考えてみてください。どちらにも名前がありますが、なぜ名前があるのですか? 二人とも人だから。これで、共通のインターフェースができました。

Nameの一部であるため、両方のインターフェイスを実装するクラスは 1 回だけ実装する必要がありIPersonます。

于 2013-02-14T11:09:31.567 に答える
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ことができる場合、効果的にデコレーターになります。このように、実装を繰り返す必要はありません。LearningTeacherStudentTeacher

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 は多重継承をサポートしていないため、これが唯一の方法です。複数のインターフェイスのみを実装できます。

于 2013-02-14T11:11:26.063 に答える
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; }
}
于 2013-02-14T11:16:41.100 に答える
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;
于 2013-02-14T11:09:57.340 に答える
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; }
    }

}
于 2013-02-14T11:12:43.037 に答える
0

これらの実体を存在論的にではなく、認識論的に、すなわちそれぞれの思考行動様式によって区別することができるだろうか?

interface IPerson
{
    string Name { get; }

}


 interface ILearn
{
    Learn(  EducationLevel )

}

interface ITeach

{
      Teach(  Department  )

}
于 2013-02-14T14:09:06.993 に答える