我创建了一个类A,它有一些函数被定义为protected。
现在,B类继承A,C类继承B.类A具有私有默认构造函数和受保护的参数化构造函数。
我希望B类能够访问A类中定义的所有受保护函数,但C类只能访问某些函数,而不是所有函数和C类继承B类。
如何限制从C类访问A类的某些功能?
修改
namespace Db
{
public class A
{
private A(){}
protected A(string con){assign this value}
protected DataTable getTable(){return Table;}
protected Sqlparameters setParameters(){return parameter;}
}
}
namespace Data
{
public class B:A
{
protected B():base("constring"){}
protected DataTable output(){return getTable();}
protected sqlparameter values(param IDataParameter[] parameter){}
}
}
namespace Bsns
{
public class C:B
{
protected C():base(){}
protected DataTable show()
{return values(setparameter());}
}
}
修改
我认为我在这里要做的是多重继承。
请检查。
class A
{
//suppose 10 functions are declared
}
class B:A
{
//5 functions declared which are using A's function in internal body
}
class C:B
{
//using all functions of B but require only 4 functions of A to be accessible by C.
}
答案 0 :(得分:4)
您需要在同一个程序集中使用A和B类,在另一个程序集中使用C类。 您可以将要限制访问的成员标记为 protected internal
。这使得该成员,保护和内部。至于限制类C
对成员的访问权限,只需将其标记为internal
即可。由于这将使其成为第一个程序集中的public
,因此您可能需要添加protected
来强制执行封装。
结果标记成员protected internal
不会使其成为程序集外部的类的私有。似乎所有意图和目的protected internal
与受保护相同。不幸的是,我能看到实现这一目标的唯一方法是将其标记为内部,并将该成员公开给定义程序集。
即使C# programming guide on MSDN错了:
结合受保护和 内部关键字,一个类成员即可 被标记为内部保护 - 仅限 派生类型或类型相同 程序集可以访问该成员。
Phil Haack explains:
protected internal
表示protected
或internal
你想到的时候很清楚 关键字作为可访问性的联合 而不是交集。从而
protected interna
表示方法是 任何可以访问的东西都可以访问 UNION的protected
方法 任何可以访问internal
的内容 方法
以下是更新后的代码:
class A {
protected void Test3(){} //available to subclasses of A in any assembly
protected internal void Test() { } //Same as protected :(
public void Test2(){}//available to everyone
internal void Test4(){} //available to any class in A's assembly
}
class B : A {
void TestA() {
Test(); //OK
}
}
//Different assembly
class C : B {
void TestA() {
Test4(); //error CS0103: The name 'Test4' does not exist in the current context
}
}
答案 1 :(得分:2)
看起来你应该使用Composition not Inheritance。
A类实现了calc()和allow()。
B类有一个private A
,但不是从A
C类派生自B,无法访问B类中的私有A对象。
答案 2 :(得分:1)
我建议你重新考虑你的设计。也许有一种更简单的方法。如果C使用B的实例而不是从它派生(组合)怎么办?这样,C可以使用B的公共方法,但无法访问受保护的方法。
A类不应该关心后代的等级/深度。如果某些内容被标记为受保护,则应该为B和C保护它(无论继承链的深度如何)。 B可以通过收紧约束来选择划分其后代(但这种情况很少见)。
如果你能告诉我更多关于你的背景 - 你正试图解决的问题..我可以给你一个更详细/有用的答案。
答案 3 :(得分:0)
正如其他人所说,你可能想要使用组合而不是继承。
class A {
protected void Foo() { … }
protected int Bar() { … }
}
class B {
private A a;
public B() {
this.a = new A();
}
protected int Bar() {
return a.Bar();
}
}
class C : B { … }
但是,看看你的例子,我会质疑C是否应该从B继承,或者它是否应该只是对B类对象的引用。
就个人而言,我不会仅仅为了限制访问而将类放在不同的程序集中,如果该类在逻辑上不属于另一个程序集。还有其他方法可以处理它。