我想在派生类中限制基类方法的访问。这可能吗?
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();
}
}
但它必须从基类派生。
答案 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。任何想要绕过这个的程序员都会被迫从班级中删除“限制”。