0

我正在扩展一个库类,它有一个我不想从外部调用的公共方法。我知道我可以使用“new”关键字来隐藏它,但问题是它有很多不同的声明。像这样的东西:

class Parent() {
  public double method(double a, double b) { ... }
  public int method(int a, int b) { ... }
  public System.Int32 method(System.Int32 a, System.Int32 b) { ... }
}

现在我可以这样做:

class Child() {  
  // Make method private.
  private new double method(double a, double b) { return base.method(a, b) }
  private new int method(int a, int b) { return base.method(a, b) }
  private new System.Int32 method(System.Int32 a, System.Int32 b) { return base.method(a, b) }

  /// Own Code.
}

但我想知道是否没有更简单的方法可以将该函数的所有覆盖设为私有。

4

3 回答 3

2

我认为第一个问题是您的后代类是否需要被转换为父类。

如果不是,那么最好的方法是使用外观模式,在这种模式中隐藏“父级”并且只允许通过您的方法访问它。

有一些像:

class Parent {
  public double method(double a, double b) { ... }
  public int method(int a, int b) { ... }
}


class YourStuff {
  private Parent _parent = new Parent();

  public int AddNumbers(int a, int b) {
     return _parent.method(a,b);
  }
}

在这种情况下,父类是隐藏的。

于 2012-12-27T23:53:17.717 回答
1

这不是方法隐藏的工作方式。您的private new方法只隐藏了Child类中的原始方法(但它们调用了它们隐藏的方法,因此没有任何收获)。

Grandchild派生自 的类中,由于方法不在范围内,因此Child不再隐藏任何内容,因此 的方法是完全可调用且“裸露的”。方法隐藏不会以任何方式移除隐藏的方法;这只是调用哪个相同方法的问题。private newpublicParent

于 2012-12-27T23:18:48.517 回答
0

如果您希望您的库类父方法名称 Method 不能从外部调用,您需要更改访问修饰符。您的类没有访问修饰符,因此默认情况下它是 Internal - 同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问该类型或成员。Method Method 具有相同的可访问性,因为它具有访问修饰符 public。如果您希望在类方法中实现的方法只能对派生类实例进行访问,您需要所有访问修饰符公共的重载方法变体更改为受保护,然后在子类中隐藏此方法重载方法。如果您希望从外部使用这些隐藏方法,您需要将它们的访问修饰符从私有更改为公共。此实现的示例:

namespace HideBaseClassMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            Parent myParent = new Parent();
            //myParent. - no one of overloaded protected methods are accessible after dot operator
           Child myChild = new Child();
           myChild.Method(2.5, 4.3); //double 
           myChild.Method(2, 4);//int

           Parent myChildCreatedAsParent = new Child();
           //myChildCreatedAsParent.  - no one of overloaded protected methods are accessible after dot operator
        }
    }
    class Parent 
    {
        protected double Method(double a, double b)
        {
           Console.WriteLine($"I am a parent double method {a} + {b}");
           return a + b;
        }
        protected int Method(int a, int b)
       {
            Console.WriteLine($"I am a parent integer method {a} + {b}");
            return a + b;
       }
   }
   class Child:Parent
   {
        public new double Method(double a, double b)
        {
            Console.WriteLine($"I am a child double method {a} * {b}");
            return a * b;
        }
        public new int Method(int a, int b)
        {
            Console.WriteLine($"I am a child integer method {a} * {b}");
            return a + b;
        }
    }
}

该程序执行的结果将是:

我是小孩双法2.5*4.3

我是一个孩子整数方法2 * 4

于 2019-10-09T08:56:13.243 回答