2011-08-13 11 views
1

以下のようにインターフェイスを作成しました。 DTOオブジェクトは、3つのパラメータを持つ複合値オブジェクトです。インターフェイスで使用する必要があるクラスを拡張する

public interface IOperation 
{ 
    DTO Operate(DTO ArchiveAndPurgeDTO); 
} 

元のValueオブジェクトから継承し、必要に応じて拡張できるようにするには、このインターフェイスを援助する人が必要です。

私は、単にDTOオブジェクトを継承し、別のプロパティを追加して、このインターフェイスを暗示するのと同じクラスで使用すると仮定しました。

拡張値オブジェクトを使用しようとすると、Visual Studioは、もはやインターフェイスを実装していないと訴えます。

この機能をどのようにすることができますか。

ご意見、ご提案などありがとうございます。

Gineer

編集: DTOコード:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Company.ArchiveAndPurge 
{ 
    public class DTO 
    { 
     public DTO(String FriendlyID) 
     { 
      friendlyId = FriendlyID; 
     } 

     private String friendlyId = String.Empty; 

     public String FriendlyId 
     { 
      get { return friendlyId; } 
      set { friendlyId = value; } 
     } 

     private String internalId = String.Empty; 

     public String InternalyId 
     { 
      get { return internalId; } 
      set { internalId = value; } 
     } 

     private Boolean archivedSuccessfully = false; 

     public Boolean ArchivedSuccessfully 
     { 
      get { return archivedSuccessfully; } 
      set { archivedSuccessfully = value; } 
     } 
    } 
} 

拡張DTO:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Company.MSO.ArchiveAndPurge 
{ 
    public class DTO: Company.ArchiveAndPurge.DTO 
    { 
     private Boolean requiresArchiving = true; 

     public Boolean RequiresArchiving 
     { 
      get { return requiresArchiving; } 
      set { requiresArchiving = value; } 
     } 
    } 
} 
VSが苦情

インタフェースの実装:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Company.ArchiveAndPurge.Contracts; 
using Company.ArchiveAndPurge; 

namespace Company.MSO.ArchiveAndPurge 
{ 
    public class ResolveFriendlyId: IOperation 
    { 
     #region IOperation Members 

     public DTO Operate(DTO ArchiveAndPurgeDTO) 
     { 
      ArchiveAndPurgeDTO.InternalyId = ArchiveAndPurgeDTO.FriendlyId; 
      return ArchiveAndPurgeDTO; 
     } 

     #endregion 
    } 
} 
+0

表示DTOクラス私はあなたが一般的なインタフェースを作りたいかもしれない疑い

IOperation operation = new ExtendedOperation(); operation.Operate(new DTO()); 

を:このようなコードと互換性があるような方法でコードとコードここでVSはエラーを返す – sll

答えて

2

私の理解では、おそらくのようなものだった:インターフェイスメソッドを実装するときは、戻り値の型を変更することはできません

  • :二つの方法では動作しません

    public class ExtendedOperation : IOperation 
    { 
        public ExtendedDTO Operate(ExtendedDTO dto) 
        { 
         ... 
        } 
    } 
    

  • あなたが特に

インタフェースを実装するとき、あなたはを実装することはないパラメータリストを変更することはできません

public interface IOperation<T> where T : DTO 
{ 
    T Operate(T dto); 
} 
+0

いつものように、Jon Skeetはもっと速いです。 ;) – magnattic

1

利用ジェネリック:

public interface IOperation<T> where T : DTO 
{ 
    T Operate(T ArchiveAndPurgeDTO); 
} 
関連する問題