这在c#中可能吗?只有一个类访问基类方法,第二个类不能访问同一个基类方法
本文关键字:基类 访问 类方法 第二个 同一个 不能 有一个 这在 | 更新日期: 2023-09-27 18:02:13
A是基类
B来源于A, C来源于A
我希望只有B可以访问A的方法,C不能访问A的相同方法
class A {
protected void Foo() {
}
}
class B : A {
void Bar() {
this.Foo(); // OK
}
}
class C : A {
void Baz() {
this.Foo(); // I don't want to permit this
}
}
我认为这看起来像是Interface segregation principle
的问题:
客户端不应该被强制依赖于它们不依赖的接口使用。
但是在您的情况下,这可以改写为类继承。
创建纯基类(没有想要隐藏类C
的方法)
public class Base
{
protected void SomeDummyMethod()
{
}
}
然后创建从Base
继承的A
类,并为B
类添加一个共享的方法
public class A : Base
{
protected void YourFooMethod()
{
}
}
创建从A
继承的B
类,可以访问包括YourFooMethod
在内的所有功能
public class B : A
{
public void Bar()
{
this.YourFooMethod();
}
}
最后是C
类它具有除了YourFooMethod
方法之外的所有基本功能
public class C : Base
{
public void Bar()
{
this.YourFooMethod(); //Compile error: YourFooMethod is not a member of...
}
}
我认为您可以在类A中编写代码,根据白名单或黑名单检查调用类名,并在您希望禁止的情况下抛出异常,但我不建议这样做。这将非常难以维护,而且类A不应该需要知道每个扩展它的类。
你要做的事实在是个坏主意。
c#(和一般的。net)有访问修饰符:
-
public
-任何人都可以访问 -
private
-只有包含作用域/类型可以访问 -
protected
-只有包含类型及其派生类型可以访问 -
internal
-只有在同一程序集(或InternalsVisibleTo
程序集)中定义的类型才能访问 -
protected internal
-protected
和internal
的集并可以访问。
你要求private
和protected
之间的东西,在那里你可以手动限制对命名类型的访问。
这是目前不可能强制执行的,至少在编译时,在。net中-尽管如果类型A
和B
存在于同一个程序集中,C
存在于不同的程序集中,那么internal
就可以工作。
在运行时,您可以使用代码访问安全性来强制执行,或者更简单:使用反射来获取调用类的名称(this.GetType()
),或者使用密码:
或更简单:密码要求:
class A {
private Boolean isAllowedAccess;
protected A(String password) {
this.isAllowedAccess = password == "12345abc";
}
protected void Foo() {
if( !this.isAllowedAccess ) throw new InvalidOperationException();
}
}
class B : A {
public B() : base("12345abc") {
}
void Bar() {
this.Foo(); // OK
}
}
class C : A {
public C() : base(null) {
}
void Baz() {
this.Foo(); // I don't want to permit this
}
}