我在试图实现多重继承。 我怎样才能做到这一点(Am I trying to Implement

2019-10-21 20:14发布

我创建了一个类说一个具有为受保护的定义某些功能。

现在,B类继承A和C类继承B. A类有私人默认构造函数和保护参数的构造函数。

我想B类是能够访问所有的类定义的保护功能,但C类可以对某些功能的访问只不是所有的功能和C类是继承类B.

我如何才能限制一些A类的从C类的功能?

编辑:

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.
}

Answer 1:

我建议你重新考虑你的设计。 也许还有一个更简单的方法。 如果C使用B的实例,而不是从它(组合物)的导出? 是c的方法可以使用B的公共方法,但不能访问受保护的。

A类不应该关心后代的水平/深度。 如果事情被标记保护,应该保护的B和C(无论继承链的深度)。 B可以选择通过收紧制约界定其后代(但这是罕见的)。

如果你能告诉我更多关于你的背景 - 你正在试图解决这个问题。我可以给你一个更详细的/有用的答案。



Answer 2:

你需要有类A和B在另一装配相同的程序集和C类。 您可以标记要通过派生类,以限制访问的成员protected internal 这使得成员,那么,保护和内部。 至于限制类C “s到成员访问这将足以将其标记internal 因为这将使其它public的第一组件内,你可能要添加protected执行封装。

原来标记的成员protected internal不让它私有类的组件之外。 似乎所有意图和目的, protected internal是一样的保护。 不幸的是,我可以看到实现这一目标的唯一方法是将其标记为内部和忍受件是公众定义装配。

即使在MSDN C#编程指南得到一个错误:

通过组合保护和内部的关键字,一个类的成员可以被标记保护的内部 - 仅源自的相同组件内的类型或类型可以访问该成员。

菲尔哈克解释说 :

protected internal 手段 protected internal

当你想到的关键词是无障碍的工会,而不是路口的这是非常清楚的。 因此, protected interna意味着该方法是通过任何可以访问访问protected与任何可以访问该方法UNION 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
  }
 }


Answer 3:

它看起来像你应该使用成分不继承。

一个类实现计算值(),并允许()。

B类有一个private A但不是从A衍生

C类选自B导出,并且具有类B.没有访问私有目的



Answer 4:

正如其他人所说,你可能想用的组合物,而不是继承的。

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类型的对象的引用

就个人而言,我不会去投入不同的组件类只是为了限制访问,如果类没有逻辑,否则在不同的装配属于的目的。 还有其他的方法来处理它。



文章来源: Am I trying to Implement Multiple Inheritance. How can I do this