扩展必须在接口中使用的类
本文关键字:接口 扩展 | 更新日期: 2023-09-27 18:05:22
我已经创建了一个如下所示的接口。DTO对象是一个有3个参数的复杂值对象。
public interface IOperation
{
DTO Operate(DTO ArchiveAndPurgeDTO);
}
我需要实现这个接口的人能够继承原始的Value对象,并在需要的地方扩展它。
我的假设是,他们可以简单地继承DTO对象,添加(例如)另一个属性,并在实现该接口的同一个类中使用它。
当我尝试使用扩展值对象时,Visual Studio抱怨我不再实现接口。
如何实现这个功能
提前感谢任何想法,和/或建议。
工程师编辑:
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
}
}
据我所知,您可能有如下内容:
public class ExtendedOperation : IOperation
{
public ExtendedDTO Operate(ExtendedDTO dto)
{
...
}
}
在两种情况下不起作用:
- 在实现接口方法时不能更改返回类型
- 实现接口时不能更改参数列表
特别是,您不会以与以下代码兼容的方式实现IOperation
:
IOperation operation = new ExtendedOperation();
operation.Operate(new DTO());
我怀疑你可能想让接口泛型:
public interface IOperation<T> where T : DTO
{
T Operate(T dto);
}
使用泛型:
public interface IOperation<T> where T : DTO
{
T Operate(T ArchiveAndPurgeDTO);
}