расширяющие классы, которые должны использоваться в интерфейсе - PullRequest
1 голос
/ 13 августа 2011

Я создал интерфейс, как показано ниже.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
    }
}

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Насколько я понимаю, у вас, вероятно, было что-то вроде:

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);
}
1 голос
/ 13 августа 2011

Использование Generics:

public interface IOperation<T> where T : DTO
{
    T Operate(T ArchiveAndPurgeDTO);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...