C # OOP Привести параметр интерфейса к конкретному типу - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать своего рода основу для какого-то базового процесса в приложении. Существует некоторое общее поведение, когда я должен выполнить некоторые операции, но эти операции различаются в зависимости от некоторых сценариев. Я сделал что-то, я не уверен, считается ли плохой практикой делать что-то вроде этого:

public interface IMyDto
{
    string makerIdentifier { get; set; }
}

public class DtoOne:IMyDto
{
    public string makerIdentifier { get; set; }
    //Custom properties for ConcreteOne
}

public class DtoTwo:IMyDto
{
    public string makerIdentifier { get; set; }
    //Custom properties for ConcreteTwo
}

public abstract class AbstractMaker
{
    public abstract void DoSomething(IMyDto myInterface);
}

public class ConcreteMakerOne:AbstractMaker
{
    public override void DoSomething(IMyDto myInterface)
    {
        var concrete = myInterface as DtoOne;
        // If concrete is not null..do stuff with DtoOne properties
    }
}

public class ConcreteMakerTwo : AbstractMaker
{
    public override void DoSomething(IMyDto myInterface)
    {
        var concrete = myInterface as DtoTwo;
        // If concrete is not null..do stuff with DtoTwo properties
    }
}

public class Customer
{
    public void MakeSomething(IMyDto myDto)
    {
        var maker = GetMaker();
        maker.DoSomething(myDto);
    }

    private AbstractMaker GetMaker()
    {
        //Stuff to determine if return ConcreteOne or ConcreteTwo
    }
}

Код, которым я не доволен, это:

var concrete = myInterface as DtoOne;

Я был бы очень признателен, если бы кто-нибудь дал мне совет или совет по поводу схемы или хорошей практики для этого сценария.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я не уверен, правильно ли я понимаю, о чем вы спрашиваете, но почему бы просто не поместить метод DoSomething в IMyDto и реализовать его по-другому в DtoOne, DtoTwo и т. Д.? Будет только один Maker и он всегда будет вызывать один и тот же метод.

0 голосов
/ 08 января 2019

Непонятно, каковы все ваши варианты использования, но один из вариантов может быть универсальным:

public abstract class AbstractMaker<T> where T:IMyDto
{
    public abstract void DoSomething(T myInterface);
}

public class ConcreteMakerTwo : AbstractMaker<DtoTwo>
{
    public override void DoSomething(DtoTwo myInterface)
    {
        // now you are certain that myInterface is a DtoTwo
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...