Интерфейс, необходимый для доступа к переопределенному абстрактному свойству в классах, производных от общей абстрактной базы? - PullRequest
1 голос
/ 26 марта 2019

Итак, моя дилемма в том, что для доступа к IntThing или StringThing * MyProperty из UtilityThing<T> я определяю интерфейс с MyProperty и использую его как общее ограничение для T в UtilityThing<T>.Это работает, но кажется избыточным, учитывая, что то же свойство уже определено в абстрактной базе.Я пропускаю аспект дизайна здесь, или это действительно так, как это нужно сделать в данном случае?

public interface IThing {
    string MyProperty { get; set; } 
}

public abstract class Thing<T> {
    protected string _MyProperty;
    public abstract string MyProperty { get; set; }
    public T OtherProperty { get; set; }

    public string CommonMethod() {
        return MyProperty + "foobar";   
    }
}

public class IntThing : Thing<int?>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = value + OtherProperty.ToString(); }
    }
}

public class StringThing: Thing<string>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = OtherProperty + value; }
    }
}

public class UtilityThing<T> where T: IThing, new() {
    public T DoIt(SomeContext someContext, string name) {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal }
        return thing;
    }
}

1 Ответ

2 голосов
/ 26 марта 2019

Вам нужно будет ввести новый общий тип. Как только новый тип введен, вы можете устранить необходимость интерфейса.

public class UtilityThing<T, I> where T : Thing<I>, new()
{
    public T DoIt(SomeContext someContext, string name)
    {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal };
        return thing;
    }
}

И вы можете использовать его так:

var utility = new UtilityThing<IntThing, int?>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...