C# 为什么要使用;新";什么时候隐藏方法?
当一个方法需要隐藏时,为什么需要使用new关键字 我有两门课:C# 为什么要使用;新";什么时候隐藏方法?,c#,.net,C#,.net,当一个方法需要隐藏时,为什么需要使用new关键字 我有两门课: public class Parent { public void Print() { Console.WriteLine("Parent"); } } public class Child : Parent { public void Print() { Console.WriteLine("Child"); } } 以下代码生成给定的输出: Pa
public class Parent
{
public void Print()
{
Console.WriteLine("Parent");
}
}
public class Child : Parent
{
public void Print()
{
Console.WriteLine("Child");
}
}
以下代码生成给定的输出:
Parent sut = new Child();
sut.Print();
输出:父级
Child sut = new Child();
sut.Print();
产出:儿童
我理解,如果隐藏不是故意的,这可能是一个问题,但是否有其他理由使用“新”(除非避免警告)
编辑:
也许我不清楚。同样的情况如下:
public void foo(Parent p)
{
p.Print();
}
这就是所谓的:
Child c = new Child;
foo (c);c
因为它明确表明您有意隐藏父方法,而不是重写它。当您不使用
new
时,会出现一个警告,因为您的子类的方法可能有输入错误,并且意外地隐藏父方法可能会导致一些微妙的错误。如果您试图使用继承,则应将该方法设置在基类中,并将其设置在子类中
语言设计者已经决定,如果不使用这些关键字,那么方法隐藏应该使用
new
关键字显式完成。只需标记父级的方法virtual
。然后在子类中执行public override void Print()
public class Parent
{
public virtual void Print()
{
Console.WriteLine("Parent");
}
}
public class Child : Parent
{
public override void Print()
{
Console.WriteLine("Child");
}
}
通过这种方式,您可以获得真正的继承,并且您可以通过调用base.Print()
从子级调用parentsPrint()
方法,如果基类中具有相同签名的方法没有标记为abstract
或virtual
否,则必须使用new
关键字,但是避免警告是非常重要的。隐藏导致的错误可能是不必要的,在C++之后(只是让你这样做),java和C都选择了两种不同的方法来阻止它们。
在Java中,不可能隐藏基类方法。如果你想这么做,编译器会大喊大叫的
在C#中,有一个“new”关键字。它允许您显式地隐藏一个方法,如果您不使用它,编译器将警告您。许多开发人员都规定代码编译器不带警告,因为警告可能是坏代码的标志
在那之后,我再也不用躲起来了。我会仔细考虑为什么我会考虑使用它,因为它的行为是奇怪的,几乎从来没有我想要的。
当一个方法需要隐藏时,为什么需要使用new关键字
这是没有必要的。new
的唯一功能是抑制警告
问题可能是:为什么隐藏基类成员不是一个错误?添加到您的问题的答案
也许我不清楚。是一样的
情况如下:
public void foo(Parent p)
{
p.Print();
}
公共无效foo(父p){
p、 Print();},它被称为:
Child c = new Child;
foo (c);c
儿童c=新生儿童;傅(丙),
答案是foo(c)
将输出父对象。如果像示例中那样调用父类,则隐藏父方法的方法将不会执行。要获得Child的输出,您需要按照前面的回答使用virtual和override。隐藏是个坏主意。这会使代码更加混乱,您的意图也不清楚。编程语言是向编译器和其他程序员表达您的意图。如果没有一个新的关键字,就不清楚您的意图是重写还是隐藏,或者您只是不知道基本方法
还有一个简单的因素。“用脚射自己。你确定吗?确定/取消”
真正的问题是为什么一开始就允许隐藏。不允许隐藏的问题是,如果您从另一个程序集中的类派生并添加一个Foo()方法,然后另一个程序集被更新以添加一个Foo()方法,不允许隐藏将破坏您的代码。扩展Jon Hanna所说的内容
警告的目的是告诉您可能没有注意到名称冲突。收到警告后,应执行以下操作之一:
添加virtual和override以多态方式重写基类中的方法
重命名方法,使其名称不再与基类中的方法冲突
添加新内容以明确隐藏方法的意图
如果要扩展或细化基类中方法的行为,请使用virtual和override,正如其他人在这里所说的那样
如果您是第一次编写方法,并且发现有一个不知道的名称冲突,并且不打算重写,只需重命名方法即可
选项1或2通常更可取。那么你什么时候应该选择第三种选择呢
当基类不是代码时,使用选项3。您没有向其中添加虚拟文件的选项。您需要新产品的典型场景如下所示:
你买了第三方图书馆。它有一门有趣的课。您从类继承并添加了原始作者未提供的新方法。到目前为止,还没有涉及隐藏或覆盖。现在,您将收到该库的版本2,其中包含一些您想要使用的新功能。作者向类中添加了一个新方法,其名称与您在派生类中编写的方法冲突
如果您的方法没有被广泛使用,您应该将其重命名,选项2。但是,如果您的方法有许多依赖项,那么重命名它将非常有破坏性。因此,您添加了一个新名称,表示您的方法和基类中的方法之间没有逻辑连接,即使它们碰巧具有相同的名称。您无法向基类中的方法添加虚拟对象,也不希望这样做。这两个方法是由不同的开发人员设计的,而您的方法并没有细化或扩展基类中的方法——当您编写自己的方法时,基类中的方法并不存在
因此,很少需要新关键字,但如果需要,就需要导入