禁止基层的垂头丧气

时间:2014-09-30 17:30:42

标签: c# .net casting downcast

Downcasts是一种代码气味。实现基类;在C#中是否有一种方法可以通过继承类来防止基类或接口被下载?应保留从基类派生的能力。

示例

interface IFoo { /* ... */ } // Only this interface can be modified.

class Bar : IFoo { /* ... */ }

void doSthWith(IFoo f)
{
    Bar b = (Bar) f; // to prohibit
}

4 个答案:

答案 0 :(得分:3)

我不会跟你讨论代码气味,但是你总是可以尝试从基类到派生类的向下转换(当然,它可能会失败)。

即使有可能, 有效的向下转型方案,如果这是在库中,您将限制潜在用户。

有关详细信息,请参阅MSDN上的投稿文章。

来自C#5.0规范:

  

cast-expression用于将表达式显式转换为a   给定类型。 cast-expression :(类型)一元表达式A.   形式(T)E的cast-expression,其中T是类型,E是a   unary-expression执行值的显式转换(第6.2节)   E的类型为T.如果从E到T没有显式转换,则a   发生绑定时错误。否则,结果是产生的值   通过显式转换。结果始终归类为a   值,即使E表示变量。

  

要使显式引用转换在运行时成功,源操作数的值必须为null,或源操作数引用的对象的实际类型必须是可以通过以下方式转换为目标类型的类型:隐式引用转换(第6.1.6节)或装箱转换(第6.1.7节)。

还有更多,但没有任何表明限制施法的方法。

答案 1 :(得分:2)

  

Downcast是一种代码气味

我不同意这个说法,但暂时不要理会它。

您不能阻止基类的向下转换,但您可以将派生类设为内部(以便客户端代码甚至不知道它们),并使基类构造函数也在内部以防止客户端代码继承它(当然,假设将使用你的类的代码在不同的程序集中)。

  

应保留从基类派生的能力。

如果您的意思是希望客户端代码能够继承您的类,那么您将无法阻止向下转发。

答案 2 :(得分:2)

不。你不能阻止它,但你可以减少它的用处。

如果你明确地实现了接口,那么除非你有一个接口引用,否则你不能调用接口方法。

public interface IFoo
{
    void Test();
}

public class Foo : IFoo
{
    void IFoo.Test() { }
}

然后下面的代码将无法编译:

    IFoo x = new Foo();
    x.Test(); // works

    Foo y = (Foo)x;
    y.Test(); // will not compile

答案 3 :(得分:2)

正如其他人所说,没有办法禁止编译器允许这种向下转发。

但是,如果你真的很有动力并使用兼容的过程,你可以为FxCop的ReSharper编写一个代码分析插件。这些可用于CI系统中的构建失败。

我不确定我个人会对这样的事情如此苛刻。

编辑我不是100%清楚这可能如何工作,但您也可以通过某种方式使用Roslyn项目来实现这一目标。至少,它会为某人制作一篇有趣的博客文章。