Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要使用;新";什么时候隐藏方法?_C#_.net - Fatal编程技术网

C# 为什么要使用;新";什么时候隐藏方法?

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

当一个方法需要隐藏时,为什么需要使用new关键字

我有两门课:

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()

从子级调用parents
Print()
方法,如果基类中具有相同签名的方法没有标记为
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。但是,如果您的方法有许多依赖项,那么重命名它将非常有破坏性。因此,您添加了一个新名称,表示您的方法和基类中的方法之间没有逻辑连接,即使它们碰巧具有相同的名称。您无法向基类中的方法添加虚拟对象,也不希望这样做。这两个方法是由不同的开发人员设计的,而您的方法并没有细化或扩展基类中的方法——当您编写自己的方法时,基类中的方法并不存在

    因此,很少需要新关键字,但如果需要,就需要导入