6

私はこのようなインターフェースを持っています:

public interface IUser{
    //some properties here

    T ToDerived(User u);
}

私はインターフェース開発に不慣れなので、これが私が達成しようとしていることです。基本クラスにします

public class User 

上記のインターフェースは実装されていません。次に、派生クラスがあります

SalesUser : User, IUser
{
    //no properties needed because they exist in the User class

    SalesUser ToDerived(User u)
    {
        //code for converting a base User to a derived SalesUser
    }
}

ToDerived(User u)の関数をSalesUserクラスに記述したいのですが、インターフェイスで、現在インターフェイスにあるToDerivedメソッド宣言がコンパイルされていないため、これを定義する方法がわかりません。

これが理にかなっていることを願っています。

4

3 に答える 3

14
public interface IUser<T> where T : User
{
    //some properties here

    T ToDerived(User u);
}

SalesUser : User, IUser<SalesUser>
{
    //no properties needed because they exist in the User class

    SalesUser ToDerived(User u)
    {
        //code for converting a base User to a derived SalesUser
    }
}

Userこれがあなたの望むものかどうかはわかりませんが、ジェネリック型がそれから継承されるように、インターフェイスにジェネリック型の制約を追加しました。

于 2012-04-09T18:56:24.830 に答える
3

Odedによる回答は、コンパイルの問題を解決し、インターフェイスを満たすToDerivedメソッドを定義できるようにします。ただし、コメントで述べたように、これが最適な実装であるかどうかは正確にはわかりません。

私が抱えている主な問題は、このような変換メソッドが通常、静的なコンテキストで必要になることです。SalesUserのインスタンスはありません。必要なものであり、ユーザーがいるため、静的コンテキストでメソッドを呼び出します(SalesUser.ToDerived(myUser))そしてSalesUserを取得します(メソッドはFromUser()などの名前がより適切になります)。インターフェイスで指定するメソッドでは、ユーザーをSalesUserに変換するために、SalesUserがすでに存在している必要があります。既存のSalesUserが本当に必要になると私が考えることができる唯一の状況は、「部分的なクローン」の場合です。渡されたユーザーとメソッドを呼び出しているSalesUserの両方からの情報を使用して、新しいSalesUserインスタンスを作成しています。他のすべての場合、SalesUser(変換、前述のように静的である必要があります)、またはUser(「クローン」または「ディープコピー」メソッドで新しいインスタンスを生成する方法)は必要ありません。メソッドを呼び出したインスタンスと同じデータ)。

また、クラスのコンシューマーは、ユーザーからSalesUserへの変換を実行するためにToDerived()を呼び出す必要があることを知っている必要があります。通常、C#プログラマーは、明示的または暗黙的な変換が利用可能であることを期待します。

public class SalesUser
{

    public static explicit operator (User user)
    {
        //perform conversion of User to SalesUser
    }

}

//the above operator permits the following:
mySalesUser = (SalesUser)myUser;

...または、変換演算子が失敗した場合、ユーザーを使用してSalesUserを作成できることが期待されます。

public class SalesUser:IUser
{
   public SalesUser(User user)
   {
      //initialize this instance using the User object
   }
}

//the above allows you to do this:
mySalesUser = new SalesUser(myUser);

//and it also allows the definition of a method like this,
//which requires the generic to be an IUser and also requires a constructor with a User
public void DoSomethingWithIUser<T>(User myUser) where T:IUser, new(User)
{ 
    //...which would allow you to perform the "conversion" by creating a T:
    var myT = new T(myUser);
}

現在、静的メンバーはインターフェース定義を満たさず、インターフェースは静的メンバーまたはコンストラクター署名を定義できません。これは、IUserインターフェイスが変換メソッドを定義しようとしてはならないことを示しています。代わりに、ある種のIUserを必要とするメソッドは、単にそれを指定でき、ユーザーは、実装がそれ自体に変換できることを知る必要なしに、必要に応じて実装を提供できます。

于 2012-04-09T19:59:52.833 に答える
0

インターフェイスは実装を提供せずにクラスとそのメンバーを定義することを忘れないでください。インターフェイスを作成できますが、インターフェイスには実装クラスが必要です。

于 2012-04-09T19:05:13.390 に答える