我正在尝试定义一个类,其中"I"可以访问所有公共方法,但是当我将实例传递给用户提供的函数时,它们只能访问公共方法的子集。 大致如下:
// 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)的各种方法,这些实例似乎都不起作用,并且在使用抽象类时遇到了一些刺痛(这伤害了我的头部并且没有产生更好的结果)。
似乎有效的是在我的代码中定义大师班。 然后,我可以在调用UserFunction时将其转换为"(UserClass)",并且用户将无法看到Master方法。 但是,考虑到我可能需要(大量?)这样的类,这真的会使我的主要程序/文件变得混乱。 我很想知道是否有更好/更好/更容易/(?)的方式来做我想做的事?
不使用继承创建一个实现"真正公共"函数的包装类。该包装器只是将参数传递给持有的实例引用。因为包装器不是从内部类型派生的,所以你不会遇到强制转换的能力。