这在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
    }
}

这在c#中可能吗?只有一个类访问基类方法,第二个类不能访问同一个基类方法

我认为这看起来像是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 - protectedinternal的集并可以访问。

你要求privateprotected之间的东西,在那里你可以手动限制对命名类型的访问。

这是目前不可能强制执行的,至少在编译时,在。net中-尽管如果类型AB存在于同一个程序集中,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
    }
}