Общий интерфейс с указателем метода - PullRequest
2 голосов
/ 08 июня 2010

Итак, сначала у меня есть интерфейс свойств моей команды

public interface ICommandProperty<T, U>
{
    Func<T> CreateCommand { get; set; }
    Func<T, U> ParseResponse { get; set; }
}

Идея состоит в том, что я могу создать простой парсер, который принимает строку и возвращает IP-адрес, например.

Этот интерфейс затем используется в другом интерфейсе:

public interface IDeviceCommand
{

    Func<ICommandProperty<object, object>> SetCommand
    {
        get;
        set;
    }
    Func<ICommandProperty<object, object>> GetCommand
    {
        get;
        set;
    }
    string Name { get; set; }
}

Возможно, я все делаю неправильно, но здесь у меня проблема. В настоящее время у меня есть универсальный интерфейс, объявленный с объектами, потому что я не могу найти способ их общей установки (IDeviceCommand не может быть универсальным по разным причинам).

Моя конкретная реализация выглядит так:

public class DeviceCommand:IDeviceCommand 
{
    public DeviceCommand(string name,Func<ICommandProperty<object,object>> Set,Func<ICommandProperty<object,object>> Get)
    {
        this.Name = name;
        this.SetCommand = Set;
        this.GetCommand = Get;
    }
    #region IDeviceCommand Members
    public string Name
    {
        get;
        set;
    }
    public object Value
    {
        get;
        set;
    }
    public Func<ICommandProperty<object, object>> SetCommand
    {
        get;
        set;
    }
    public Func<ICommandProperty<object, object>> GetCommand
    {
        get;
        set;
    }
    #endregion
}

Я мог бы сделать DeviceCommand универсальным классом и использовать T, U в SetCommand и GetCommand, но тогда он не удовлетворяет интерфейсу IDeviceCommand, потому что Func<ICommandProperty<T,U>> isn't Func<ICommandProperty<object,object>>

Есть ли другой подход, который я должен использовать здесь. По сути, я пытаюсь создать указатель метода, который можно установить при создании экземпляра DeviceCommand.

1 Ответ

1 голос
/ 08 июня 2010

Ваши вопросы кажутся немного расплывчатыми, но вот несколько идей.Во-первых, стоит рассмотреть использование методов вместо свойств, чтобы они могли быть общими, а не классом.Не уверен, что это сработает для вас.Вы также можете рассмотреть возможность передачи объекта "строитель" в команду вашего устройства, а не самих функций <>.И, наконец, это раздражает вашего клиента, который знает, о чем просить, и гарантирует, что он работает с объектом, который имеет правильный доступный функционал <>.В этом случае, возможно, что-то вроде методов IDeviceCommand.Create и .Parse может работать для вас.

Наконец, если вы всегда ищете что-то, чтобы взять строку и вернуть IP, обобщенные значения могут быть не нужныМогут быть исследованы даже простые старые делегаты.

public interface ICommandProperty<T, U>
    {
        Func<T> CreateCommand { get; set; }
        Func<T, U> ParseResponse { get; set; }
    }

    public interface IDeviceCommand
    {

        void SetCreateCommand<T, U>(Func<ICommandProperty<T, U>> cmd);
        void SetParseCommand<T, U>(Func<ICommandProperty<T, U>> cmd);

        Func<ICommandProperty<T, U>> GetCreateCommand<T, U>();
        Func<ICommandProperty<T, U>> GetParseCommand<T, U>();

        void Create(object someKnownObject);
        T Parse<T>(object someKnownObject);

        string Name { get; set; }
    }

    public class DeviceCommand : IDeviceCommand
    {
        public DeviceCommand(IDeviceCommandBuilder builder)
        {
            builder.SetCommands(this);
        }


        public void SetCreateCommand<T, U>(Func<ICommandProperty<T, U>> cmd)
        {
            throw new NotImplementedException();
        }

        public void SetParseCommand<T, U>(Func<ICommandProperty<T, U>> cmd)
        {
            throw new NotImplementedException();
        }

        public Func<ICommandProperty<T, U>> GetCreateCommand<T, U>()
        {
            throw new NotImplementedException();
        }

        public Func<ICommandProperty<T, U>> GetParseCommand<T, U>()
        {
            throw new NotImplementedException();
        }

        public void Create(object someKnownObject)
        {
            throw new NotImplementedException();
        }

        public T Parse<T>(object someKnownObject)
        {
            throw new NotImplementedException();
        }

        public string Name
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }
    }

    public interface IDeviceCommandBuilder
    {
        void SetCommands(IDeviceCommand command);
    }

    public class DeviceCommandBuilder : IDeviceCommandBuilder
    {
        public void SetCommands(IDeviceCommand command)
        {
            command.SetCreateCommand<string,Uri>(.)
            ;
            command.SetParseCommand(.);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...