【问题标题】:How to give access to selective class methods in inheritance?如何在继承中访问选择性类方法?
【发布时间】:2017-07-22 04:06:32
【问题描述】:

我们有一个基类 A,它由 6 个公共方法组成:

public class A
{ 
 public void method1()
 {
  // Implementation
 }

 public void method2()
 {
   // Implementation
 }
 .
 . 
 .
 .
 public void method6()
 {
  // Implementation
 }
}

我们有两个继承自 A 的子类 B 和 C。我如何以 B 类只能访问方法 1()、方法 2()、方法 3() 而 C 类可以访问方法 4 的方式实现它(),method5(),method6()??

【问题讨论】:

  • 你不能,基本上。它们是公共方法 - anything 可以调用它们,无论继承如何。听起来你可能真的想要两个单独的课程......
  • 那么你需要两节课。类A1B 的父类,A2C 的父类,A1A2 都继承类A 或实现接口IA
  • 我认为组合是要走的路
  • 你这样做是为了达到什么目的?

标签: c# oop inheritance


【解决方案1】:

您无法阻止某些东西使用公共类A 方法,但您绝对可以通过正确使用接口来隐藏它们。

interface IAOne 
{
    void method1();
    void method2();
    void method3();
}

interface IATwo 
{
    void method4();
    void method5();
    void method6();
}

class A : IAOne, IATwo
{
    void method1() { }
    void method2() { }
    void method3() { }
    void method4() { }
    void method5() { }
    void method6() { }
}

所以现在你有了B 类,它永远不需要知道AA 的方法。它只知道IAOne 接口。 B 现在还可以重新公开任何方法(甚至重新实现接口)并将这些方法的实现委托给A

class B : IAOne 
{
    private IAOne _a;
    public B(IAOne a) { _a = a; }

    void method1() { _a.method1(); }
    void method2() { _a.method2(); }
    void method3() { _a.method3(); }
}

【讨论】:

  • 但是在这种情况下,我不会使用 A 类对吗?所以这并不能解决目的!!!
  • @SriramM 根据您的问题是什么。如果有原因这不起作用,那么您的问题很糟糕,并且没有正确列出要求。
  • 这是正确的解决方案:明智地使用接口,组合而不是继承。
【解决方案2】:

你基本上不能这样做。您尝试这样做的事实应该作为您的代码有问题的警告。

【讨论】:

    【解决方案3】:

    我现在不明白为什么你要强调使用一个类 (A) 和所有 6 种方法,但如果你想得到它,你应该考虑编程设计并将拦截器放在你的方法的头上。然后您可以使用 MethodCallerInfo 检查调用者并控制每个子类只需调用自己的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2021-05-07
      • 2012-02-28
      相关资源
      最近更新 更多