如何防止方法被实例化

时间:2014-08-28 06:36:13

标签: c# oop

如何防止我在类中实现的接口方法被实例化。

public interface Interface1
{
    void Show();
}

public class ABC : Interface1
    {

        public void Show()
        {
            // any thing
      console.WriteLine(:Hello");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            ABC a = new ABC();

        }
    }

在程序类中,我不想创建访问此方法。

3 个答案:

答案 0 :(得分:4)

如果您真的只希望通过接口类型的表达式使用该方法,则可以使用explicit interface implementation

void Interface1.Show()
{
    throw new NotImplementedException();
}

你不能完全取消调用它的可能性 - 这显然会打破ABC实现接口的事实。实际上,如果它不会真的实现整个界面,你应该考虑是否声明它实现了接口。

通过如上所述的显式界面实现:我们有:

ABC abc = new ABC();
abc.Show(); // Error
Interface1 iface = abc;
iface.Show(); // Fine at compile time; will throw your NotImplementedException

答案 1 :(得分:2)

答案是你不能

实现接口的类需要将它们全部实现为实例方法。这就是接口如何被设计用作类的合同。

如果您要使用静态方法,则不需要接口来保存合同,因为只有一个全局静态实现。

希望有所帮助。

答案 2 :(得分:1)

如果要阻止其他类查看和调用该方法,请将其标记为私有。

但是你不能用它来实现接口,因为接口方法的定义是公开的。

此外,如果您将方法标记为私有且调用代码具有足够的权限(相同的程序集),则调用者仍可以使用Reflection调用您的方法。

您可以在方法中遍历调用堆栈,以查看它的调用位置,并确定您是否喜欢调用方,并且可以从方法中删除快捷方式,或者如果您不这样做,则抛出异常。

但真正的要求是什么?底层问题是数据安全吗?该方法是否有危险(数据损坏的可能性,或者在错误的时间或某些时候在核反应堆中提取冷却棒的可能性?)

了解要求将帮助您确定正确的解决方案。