0

我正在尝试定义一个类,其中“我”可以访问所有公共方法,但是当我将实例传递给用户提供的函数时,他们只能访问公共方法的子集。这些方面的东西:

// usercl.cs
class UserClass {
    public void UserM1();
    public int UserM2(int x);
}

// mastercl.cs
class MasterClass : UserClass {
    public void MasterM3(float y);
    public float MasterM4(int z);
}

// UserCode.cs
...
public void UserFunction(UserClass uc);
...

// Master.cs
MasterClass  mc = new MasterClass();
UserFunction( (UserClass)mc );

但是,当然,如上所述,用户可以简单地将其重铸为 (MasterClass),然后可以访问 Master 方法。我尝试将 UserClass 放在单独的(用户)命名空间中,但这在对 UserFunction 的调用中遇到了“无法将类型 X 转换为 Y”的编译错误。

我还尝试了使用多个接口实例(IMaster / IUser)的各种方法,但似乎都不起作用,并且尝试使用抽象类(这让我很头疼并且没有产生更好的结果)。

DID 似乎起作用的是在我的代码中定义 MasterClass。然后,我可以在调用 UserFunction 时将其重铸为“(UserClass)”,并且用户将无法看到 Master 方法。但是,考虑到我可能需要(大量?)这样的类,这真的会弄乱我的主程序/文件。我很想知道是否有更好/更好/更容易/(?)的方式来做我想做的事?

4

1 回答 1

1

不要使用继承,而是创建一个实现“真正公共”功能的包装类。该包装器只是将参数传递给持有的实例引用。因为包装器不是从内部类型派生的,所以您不会遇到强制转换的能力。

于 2017-12-30T23:50:01.460 回答