Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-实现一个带有两个公共接口的私有类,然后将其强制转换为这两个接口?坏主意?_C#_Design Patterns - Fatal编程技术网

C#-实现一个带有两个公共接口的私有类,然后将其强制转换为这两个接口?坏主意?

C#-实现一个带有两个公共接口的私有类,然后将其强制转换为这两个接口?坏主意?,c#,design-patterns,C#,Design Patterns,这被认为是个好主意吗?类型将同一类强制转换为它实现的两个不同接口。我认为这是个好主意。。但我不确定 public interface Abc { int xyz { get; } } public interface Xyz { int abc { get; } } internal class MyClass : Abc, Xyz { public int xyz { get { return 0;

这被认为是个好主意吗?类型将同一类强制转换为它实现的两个不同接口。我认为这是个好主意。。但我不确定

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,则忽略它;但是,如果它返回接口,则可以调用
entity.IsValid()


只是一个关于铸造的注释。一些答案表明,在实现接口时不需要强制转换。隐式实现也是如此——对于显式实现,您将需要强制转换。但我想这是很明显的:)

打字的好坏毫无疑问, 例如,List正在实现IList和IEnumerable。 当列表需要迭代时,使用IEnumerable, 当需要执行列表操作(如添加项)时,需要使用IList

因此,这取决于您需要的功能(来自哪个接口)。
当接口由类实现时,也不需要强制转换。

我认为这是引入接口的原因之一。在使用接口时,最终,您不关心哪个具体类实现了它,只要它正确地实现了这个接口


此外,你不需要投下。实现接口的类和该接口的变量的赋值是隐式的。

首先。如果您希望其他人使用您的代码,您应该真正遵循以下步骤。看起来您正在使用Java中使用的命名准则

将某些内容设置为内部的唯一原因是防止其他人创建该类。尽管使用反射,仍然是可能的。除此之外,没有理由。如果您不希望其他人扩展您的类,只需将其密封即可。但是你也应该有一个很好的理由


最后,从使用的角度来看,您的方法没有错。任何代码都不应该关心接口实现的外观或保护程度。每个用户应该只关心它有一个接口实现的实例

哦,你是说Abc=myclass。。。听起来棒极了!