0

class Person、2つの子クラスStaff、およびStudentinterface がありますIPerson。また、クラスDatabaseとクラスがありGatewayます。クラスDatabase

private string id = "username";

と方法

public void getID() {return id;}

Staff と Student の両方に getID() メソッドがあります。ゲートウェイは、メソッド getID() がStaff( return id) またはStudent( return "Go away!") によって要求されたかどうかを確認する必要があります。誰でもそれで私を助けてくれませんか。Gatewayクラスのインターフェースとして使おうと思ってDatabaseいたのですが、C#の勉強しかしていないのでどうすればいいのかわかりません。または、これを行うより良い方法があるかもしれません...助けてくださいありがとう

ここにいくつかのコードがあります:

public class Staff : Person
  {


    public Staff() {}
    public Staff(string id): base(id) {}
    public override string getName()
    {
        throw new NotImplementedException();
    }
    public override void Update(object o)
    {
      Console.WriteLine(id + " notified that {1}", id, o.ToString()); 
    }
    public override void UpdateMessage(object p)
    {
      Console.WriteLine(id + " notified about new message in chat: {1}", id, p.ToString()); 
    }
  }

public class Student : Person
{
    public Student() {}
    public Student(string id): base(id) {}
    public override string getName()
    {
        throw new NotImplementedException();
    }
    public override void Update(object o) 
    {
     Console.WriteLine(id +"  notified that {1}", id, o.ToString());
    }
    public override void UpdateMessage(object p) 
    {
     Console.WriteLine("Message for " + id + "  {1}", id, p.ToString());
    }
}

 public abstract class Person : IPerson
{
    string id;
    public Person() { }
    public abstract string getName();
    public Person(string i) { this.id = i; }
    public abstract void Update(Object o);
    public abstract void UpdateMessage(Object p);
}

public interface IPerson     
 {
   void Update(Object o);
   void UpdateMessage(Object p);
   string getName();
 }

 class database
 {
     public string username = "username";
     private string name =  "user details";
     private string grade = "user grade";

     public string getName(Object o)
     {
         if (o is Staff) { return name; }
         else { return "Go away!"; }
     }
     public string getgrade() { return grade; }
 }


 public class Gateway
   {
    public void DoSomethingWithPerson(IPerson person)
    {
        string iD = person.getName();
        if (person is Student)
        {
            return "go away!";
        }
        else if (person is Staff)
        {
            return name;
        }
    }
}
4

2 に答える 2

1

is私はチェーンを完全に思いとどまらせます。Liskovに違反しています。要するに、これは、その新しいタイプに対処するためにIPerson変更せずに新しい実装を追加することは難しいことを意味します。Gatewayあるいは、開発者は既存の型の 1 つから派生して新しい を実装する必要がIPersonあります。この場合、単なる抽象Person型に対するインターフェイスのポイントは何でしょうか?

public class Gateway
{
 public string DoSomethingWithPerson(IPerson person)
 {
    return person.DoSomething();
 }
}

//then IPerson implementors like Student can provide the custom behaviour.
public class Student : Person
{
  public string DoSomething()
  { 
      return "Go Away!";
  }
  ...
}
于 2013-05-09T12:56:58.777 に答える
0

Gateway クラスに似たようなものがあると思います。

public class Gateway
{
    public void DoSomethingWithPerson(IPerson person)
    {
        string id = person.getID();
        if (person is Student)
        {
            // do stuff for student, even cast is possible (Student) person
        }
        else if (person is Staff)
        {
            // do stuff for staff, even cast is possible (Staff) person
        }
    }
}

上記のコードgetID()は、文字列 ID を返すことを前提としています (public void getID()この回答の時点で質問の状態になっています)。


キーワードの注意点is

このisキーワードを使用すると、実行時にオブジェクトのタイプをチェックできます。これは、インターフェイス、クラス、および構造体で機能します。階層と排他条件がある場合は、次のコードがあるため注意が必要です。

if (person is Person)
{
    return;
}
else if (person is Student)
{
    // do student stuff
}

Studentはインスタンスを渡したときに「学生のことをする」ことは決してありませperson is Personん。これを克服するには、より抽象的な型チェックの前に具体的な型チェックを使用します。StudentStudentPerson

if (person is Student)
{
    // do student stuff
}
else if (person is Person)
{
    return;
}
于 2013-05-09T11:10:17.370 に答える