【问题标题】:Am I trying to Implement Multiple Inheritance. How can I do this我是否正在尝试实现多重继承。我怎样才能做到这一点
【发布时间】:2011-02-20 06:20:43
【问题描述】:

我创建了一个类 A,它有一些定义为受保护的函数。

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

我希望 B 类能够访问 A 类中定义的所有受保护函数,但 C 类可以访问某些函数,但不是所有函数,并且 C 类继承 B 类。

如何限制从 Class C 访问 Class 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.
}

【问题讨论】:

  • 为什么要这么做?如果 C 类与 A 和 B 位于不同的程序集中,则可以使用受保护的内部。
  • @Moron:不,所有类都在同一个程序集中。任何其他解决方案,我可以将 A 类拆分为更多类,但不能为 B 或 C 做到这一点
  • @Moron:如果我将所有 3 个类都放在不同的程序集中,我希望 B 类访问所有函数,但 C 类访问有限的函数。

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


【解决方案1】:

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

A 类不应该关心后代的级别/深度。如果某物被标记为受保护,则它应该同时受到 B 和 C 的保护(无论继承链的深度如何)。 B 可以选择通过加强约束来划分其后代(但这种情况很少见)。

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

【讨论】:

  • @Gishu:我希望现在给出的上述细节可能有助于理解我的问题。我的想法也和你建议的一样。使 B 密封而不是可继承。
  • @Gishu:任何建议,等待答复。
  • @Shantanu - 我需要知道 A、B 和 C 的真实姓名/职责是什么。只知道函数计数和访问修饰符没有帮助。您可以通过继承以及组合/委托重用。只有当我 100% 确定时,我才会诉诸继承。
  • @Gishu:这是我的详细信息。 A 将是一个类,它将实现数据库访问,如连接对象,执行非查询。这将放在我的其他可重用代码所在的同一命名空间下。 B 是我的数据访问层,我将使用 GetDataTable 之类的名称调用这些函数。 C 类将是我的业务层,我将在其中验证所有字段。并将 sqlparameteres 传递给数据层以生成结果。我希望很快能看到您的帮助或问题。
  • @Shantanu - 这对我来说听起来不像是继承。构图看起来更合适。 C 有一个 B 有一个 A。现在 B 可以决定它想向 C 公开 A 的哪些方法。即 B 可以访问 A 的所有公共方法。C 只能通过 B 的委托方法间接访问 A 的选定方法。
【解决方案2】:

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

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

B 类有一个private A,但不是从 A 派生的

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

【讨论】:

  • A 被 B 用作 base() 即继承构造函数调用。
【解决方案3】:

您需要在同一个程序集中有 A 类和 B 类,在另一个程序集中有 C 类。 您可以将要限制派生类访问的成员标记为protected internal。这使得成员,很好,受保护和内部。就限制类C 对成员的访问而言,将其标记为internal 就足够了。由于这将使其成为第一个程序集中的 public,因此您可能需要添加 protected 以强制封装。

事实证明,标记成员 protected internal 不会使其对程序集之外的类私有。似乎出于所有意图和目的protected internal 与受保护的相同。不幸的是,我认为实现这一点的唯一方法是将其标记为内部并容忍该成员对定义的程序集公开。

即使C# programming guide on MSDN 也弄错了:

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

菲尔·哈克explains:

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

【讨论】:

  • @lgor:在这种情况下,我将如何通过公开它们来使用 A 类中定义的其他六个函数?
  • 我希望我能多次对此表示赞同。很好的插图!
  • -1 'protected internal' 成员对任何派生类型都是可见的,无论它是否在同一个程序集中。
  • 是的,我也刚刚意识到这一点。
【解决方案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 类型对象的引用。

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

【讨论】:

  • 是的,我正在考虑由 C 继承 B。我希望 A 位于单独的程序集中,因为我将所有可重用代码放在该命名空间中。 B & C 可以放在与应用程序相关的代码相同的命名空间下。虽然我是 OOP 实施的新手。练习和 xprs 可以完美地选择要做什么。这就是我在这里寻求的。
  • 注意:命名空间与程序集不同。
猜你喜欢
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多