如何在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.
}
但是我想知道是否有一种更简单的方法来使该函数的所有覆盖私有
我认为第一个问题是你的后代类是否需要被转换为父类。
如果没有,那么最好的方法是使用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
方法不在作用域中,所以没有任何隐藏的东西,因此Parent
的public
方法是完全可调用的,并且是"裸"的。方法隐藏不会以任何方式删除隐藏方法;这只是调用相同方法中的哪个方法的问题。
如果你想让你的库类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