限制在派生类中访问方法

时间:2015-12-13 04:47:23

标签: c# oop c#-4.0

我想在派生类中限制基类方法的访问。这可能吗?

class Class1 
    {
        protected virtual void Method()
    {

    }
}

class Class2 : Class1
{
    protected override void Method()
    {
        base.Method();
    }

}

class  Class3 : Class2
{
    public Class3()
    {
        //I want to restrict to use this method in this class alone
        this.Method(); 
    }

}

但它必须从基类派生。

3 个答案:

答案 0 :(得分:7)

  

这在我的采访中被问及我的朋友也在其他一些采访中被问到。但他们告诉我们可以限制这一点。

正如其他答案所指出的那样,你所询问的是C#中无法实现的。所以,一些假设:

  • 采访者错误地认为这是可能的。
  • 面试官知道这是不可能的,想知道你是否知道这一点。
  • 面试官在提问时表现不佳;他们试图提出的问题与你在这里提出的问题不同。
  • 面试官知道这是不可能的,但想知道你是否可以提出探究性问题 - 比如"你为什么要这样做?" - 为了看看你是否是那种专注于技术问题的人,或者你是否真的试图找出用户驱动的编写软件的理由。

如果我提出这个问题,我会推迟"所以你告诉我的是你设计了一个类层次结构,其方法是如此破碎只有某些类可以正确使用它,它只能由那些类使用,对吧? 不要设计类似的方法。问题不应该是如何阻止我的同事和客户使用这种设计糟糕的方法。问题应该是如何修复方法,以便它对每个人都有用。"

答案 1 :(得分:1)

C#中没有办法本地执行此操作。

如果将方法设为私有,则没有子类可以访问它。这听起来并不像你想要的那样。如果它现在受到保护,即使你在class2中隐藏它,class3仍然可以访问class1的Method()。

基本上,基类需要有一种方法来知道是允许还是限制访问。

一种方法可能是使用接口;让子类实现IAccessRestricted空接口,并且可以使基类方法通用。当T实现IAccessRestricted时,基类方法只返回。

这个或类似的问题是访问的控制仍然不在基类中。在课堂上需要限制。所以这有点毫无意义。

因此,如果要求是某些子类可以访问,而有些则不能访问,那么我会让基类没有那个方法,然后添加一个临时基类来做,然后每个子类的子类将会或者将会不,可以访问Method()。

    class BaseWithOutMethod 
    {

    }

    class BaseWithMethod : BaseWithOutMethod
    {
        protected virtual void Method()
        {
            // do method stuff
        }
    }

    class Class2 : BaseWithMethod
    {
        protected override void Method()
        {
            base.Method();
        }
    }

    class Class3 : BaseWithOutMethod
    {
        public Class3()
        {
            // cannot access Method because it is not in this base class
        }
    }

答案 2 :(得分:0)

案例1: base.Method();是一个有效的电话。

您可以覆盖class3的Method并抛出异常

案例2 :您希望阻止3级不惜一切代价使用此方法。

您目前正面临设计问题。然后解决方案是个案问题。请记住,子类可以被视为父类。 在当前的情况下,class1的Method实现为空。声明它是抽象的。在Class2中保持抽象,但实现你想要的所有东西,然后class3将能够“实现”它完全没有代码。将存在Class4以填充Class2中丢失的代码块。

可以做的其他“黑客”。我想让你知道这是一个HACK并反映了一些设计缺陷。在class1中添加一个受保护的boolean值。在Class1的Method实现开始时,您检查bool的值并运行代码或抛出异常。然后,您可以在class3中将该布尔值设置为false,并确保它无法从父类运行代码。

另一个“更强”的工作是将一个customAttribute添加到Class3,以表示你无法调用该函数。此时,在父方法中获取当前实例的类型,并通过反射验证指定的属性是否不存在。通过这样工作,你“阻止”任何人将我之前的hack中的布尔值设置为true,调用并将其设置为false。任何想要绕过这个的程序员都会被迫从班级中删除“限制”。