代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

我是否正在尝试实现多重继承?我该怎么做

  •  1
  • Shantanu Gupta  · 技术社区  · 15 年前

    我创建了一个类say 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 回复  |  直到 15 年前
        1
  •  1
  •   Gishu    15 年前

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

    A类不应该关心后代的级别/深度。如果某个东西被标记为受保护,那么它应该同时为B和C受到保护(不管继承链的深度如何)。 B可以选择通过加强限制来界定其后代(但这是罕见的)。

    如果你能告诉我更多关于你所处环境的情况-你想解决的问题……我可以给你一个更详细/有用的答案。

        2
  •  4
  •   Igor Zevaka    15 年前

    您需要在同一个程序集中具有类A和B,在另一个程序集中具有类C。 可以将要限制派生类访问的成员标记为 protected internal . 这使得成员得到了很好的保护和内部。至于极限等级 C 对该成员的访问权限将足以标记它 internal . 因为这会成功的 public 在第一个程序集中,您可能需要添加 protected 强制封装。

    结果是标记一个成员 内部受保护 不会使它对程序集外部的类私有。似乎出于所有的意图和目的 内部受保护 与受保护的相同。不幸的是,我能看到实现这一点的唯一方法是将其标记为内部的,并容忍成员对定义大会公开。

    偶数 C# programming guide on MSDN 弄错了:

    通过将受保护和 内部关键字,类成员可以 仅标记为受保护的内部_ 派生类型或相同类型中的类型 程序集可以访问该成员。

    菲尔哈克 explains :

    内部受保护 方法 受保护的 内部的

    当你想到 关键字作为可访问性的结合 而不是十字路口。因此 protected interna 意味着方法是 任何可以访问的对象都可以访问 这个 受保护的 方法联合 任何可以访问 内部的 方法。

    以下是更新后的代码:

     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
      }
     }
    
        3
  •  2
  •   Ian Mercer    15 年前

    看起来您应该使用组合而不是继承。

    类A实现calc()和allow()。

    乙类有A private A 但不是源于

    C类从B派生,并且无权访问B类中的私有A对象。

        4
  •  0
  •   ICR    15 年前

    正如其他人所说,您可能希望使用组合而不是继承。

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

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