C#-实现带有两个公共接口的私有类,然后转换为两个接口?馊主意?

问题描述

| 这被认为是一个好主意吗?将相同的类类型转换为它实现的两个不同接口。我认为这是个好主意..但不确定。
public interface Abc
{
    int xyz { get; }
}

public interface Xyz
{
    int abc { get; }
}

internal class MyClass : Abc,Xyz
{

    public int xyz
    {
        get
        {
            return 0;
        }
    }

    public int abc
    {
        get
        {
            return 1;
        }
    }
}

        var myclass = new MyClass();

        var abc = myclass as Abc;
        var xyz = myclass as Xyz;
    

解决方法

如果它实现了该接口,则无需强制转换。 使用界面中的属性。     ,我认为这是引入接口的原因之一。最后,在使用接口时,只要它正确地实现了该接口,您就不必在意哪个具体的类可以实现它。 另外,您不需要投射。类实现接口的分配和该接口的变量是隐式的。     ,是的,这是一个好主意,特别是如果您的班级正在扮演不同的角色。 Abc和Xyz可能不是最好的示例,但ICanValidate,IHaveDefault,IHaveAnEngine等类似的内容可能会更好:) 当某些功能是可选的时,这种设计会大放异彩。以ICanValidate为例:在持久性管道中的某个位置,您可以将实体安全地投射到ICanValidate。如果返回null,则忽略它;否则返回false。但是,如果返回接口,则可以调用ѭ1。 只是有关铸造的说明。一些答案表明,在实现接口时不需要强制转换。对于隐式实现,这是正确的---对于隐式实现,您将需要强制转换。但是我想那会很明显:)     ,毫无疑问要进行类型转换, 对于前。 List正在实现IList和IEnumerable。 当需要对列表IEnumerable进行迭代时, 当需要执行列表操作(如Add item)时,需要使用IList。 因此取决于您所需的功能(从哪个接口)。 同样,当通过类实现接口时,您也不需要CASTING。     ,首先。如果您希望其他人使用您的代码,则应遵循开发类库的设计准则。您似乎正在使用Java中使用的命名准则。 进行内部设置的唯一原因是防止其他人创建该类。尽管使用反射仍然可能。除此之外,没有任何理由。如果您不希望其他人扩大班级,只需将其设为make2ѭ。但是您也应该有一个很好的理由。 最后,从使用角度来看,您的方法没有错。没有代码应该关心接口实现的外观或受保护的程度。每个用户应该只关心它具有接口实现的实例。