避免多种类型参数

时间:2014-03-07 01:28:59

标签: c#

简短版本:

如何最好地避免使用多个类型参数?根据{{​​3}},这是一个坏主意。

长版:

我有3个接口。我有多个实现这些接口的类。它看起来像这样:

public interface IMyInterface1 { }
public interface IMyInterface2 { }
public interface IMyInterface3 { }

public class MyClass1A : IMyInterface1 { public int Id { get; set; } }
public class MyClass1B : IMyInterface1 { }
public class MyClass1C : IMyInterface1 { }

public class MyClass2A : IMyInterface2 { }
public class MyClass2B : IMyInterface2 { }
public class MyClass2C : IMyInterface2 { }

public class MyClass3A : IMyInterface3 { }
public class MyClass3B : IMyInterface3 { }
public class MyClass3C : IMyInterface3 { }  

最初我有一个基类和一个派生类的类,有多个类型参数,如下所示:

public abstract class MyBaseClass<T, U, V>
    where T : IMyInterface1
    where U : IMyInterface2
    where V : IMyInterface3
{
    public T ConcreteMyInterface1 { get; set; }
    public U ConcreteMyInterface2 { get; set; }
    public V ConcreteMyInterface3 { get; set; }

    public abstract T DoStuffWithInterface1();
}

public class MyClass : MyBaseClass<MyClass1A, MyClass2A, MyClass3A>
{
    public override MyClass1A DoStuffWithInterface1()
    {
        var id = ConcreteMyInterface1.Id;
        return ConcreteMyInterface1;
    }
}  

为了删除类型参数,我重构了代码但是导致我不得不像以前一样投射:

public abstract class MyBaseClass
{
    public IMyInterface1 ConcreteMyInterface1 { get; set; }
    public IMyInterface2 ConcreteMyInterface2 { get; set; }
    public IMyInterface3 ConcreteMyInterface3 { get; set; }

    public abstract IMyInterface1 DoStuffWithInterface1();
}

public class MyClass : MyBaseClass
{
    public MyClass()
    {
        ConcreteMyInterface1 = new MyClass1A();
        ConcreteMyInterface2 = new MyClass2A();
        ConcreteMyInterface3 = new MyClass3A();
    }

    public override IMyInterface1 DoStuffWithInterface1()
    {
        var id = ((MyClass1A)ConcreteMyInterface1).Id;
        return ConcreteMyInterface1;
    }
}  

我希望得到的东西比微软在上面的链接文章中说的更有帮助:

To fix a violation of this rule, change the design to use no more than two type parameters.

0 个答案:

没有答案