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。。。听起来棒极了!