如何在c#中隐藏父方法的所有覆盖

本文关键字:方法 覆盖 隐藏 | 更新日期: 2023-09-27 17:49:45

我正在扩展一个库类,它有一个公共方法,我不想从外部调用。我知道我可以使用"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.
}

但是我想知道是否有一种更简单的方法来使该函数的所有覆盖私有

如何在c#中隐藏父方法的所有覆盖

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

如果没有,那么最好的方法是使用facade模式,在这种模式中隐藏"父",并且只允许通过您的方法访问它。

有点像:

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

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

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

Child派生的Grandchild类中,由于private new方法不在作用域中,所以没有任何隐藏的东西,因此Parentpublic方法是完全可调用的,并且是"裸"的。方法隐藏不会以任何方式删除隐藏方法;这只是调用相同方法中的哪个方法的问题。

如果你想让你的库类Parent method不能从外部调用,你需要修改访问修饰符。您的类没有访问修饰符,因此,默认情况下它是Internal -类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集中访问。方法method具有相同的可访问性,因为它具有访问修饰符public。如果你想在类中实现的方法只能对派生类实例进行访问,你需要将重载方法的所有访问修饰符public更改为protected,然后在子类中隐藏此方法的重载方法。如果希望从外部使用这些隐藏方法,则需要将其访问修饰符从private更改为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;
        }
    }
}

程序执行的结果将是:

I am a child double method 2.5 * 4.3

I am a child integer method 2 * 4