C#OOP将接口参数转换为具体类型

时间:2019-01-07 20:55:37

标签: c# oop design-patterns interface design-principles

我正在尝试为应用程序中的某些基本流程构建一种框架。在某些情况下,我必须执行一些操作,但是根据某些情况,这些操作是不同的。我做了一些不确定的事情,做这样的事情我不确定:

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 :(得分:0)

尚不清楚您的所有用例是什么,但其中一个选项可能是泛型:

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
    }
}

答案 1 :(得分:0)

我不确定我是否正确理解您的要求,但为什么不将 DoSomething 方法放入 IMyDto 中,并在 DtoOne < / em>, DtoTwo 等?只有一个 Maker ,并且总是调用相同的方法。