我是否尝试实现多重继承。我怎样才能做到这一点

时间:2010-05-17 04:57:38

标签: c# .net oop class class-design

我创建了一个类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.
}

4 个答案:

答案 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类对象的引用。

就个人而言,我不会仅仅为了限制访问而将类放在不同的程序集中,如果该类在逻辑上不属于另一个程序集。还有其他方法可以处理它。