在执行一个重构,我结束了创建如下例所示的方法。 数据类型已更改为简单起见。
我以前有过这样的赋值语句:
MyObject myVar = new MyObject();
它是重构这一意外:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
这是我的一个剪切/粘贴错误的结果,但new
的关键字private static new
有效和编译。
问 :什么是new
关键字的方法签名意味着什么? 我认为这件事情的介绍了C#3.0?
这是如何从不同的override
?
Answer 1:
从MSDN新的关键字参考:
MSDN参考
下面是我从微软的MVP网,取得了良好的感觉找到了一个例子: 链接到原始
public class A
{
public virtual void One();
public void Two();
}
public class B : A
{
public override void One();
public new void Two();
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
覆盖只能在非常特殊的情况下使用。 从MSDN:
你不能忽略非虚拟或静态方法。 所述重写的基方法必须是虚拟的,抽象的,或覆盖。
因此,需要在“新”的关键字,让你“覆盖”非虚拟和静态方法。
Answer 2:
不,它实际上不是“新”(原谅双关语)。 它基本上用于“藏”的方法。 IE:
public class Base
{
public virtual void Method(){}
}
public class Derived : Base
{
public new void Method(){}
}
如果你再这样做:
Base b = new Derived();
b.Method();
在基本的方法是一个将被调用,而不是一个在派生。
一些更多的信息: http://www.akadia.com/services/dotnet_polymorphism.html
回复您的编辑:在这个例子中,我给了,如果你是来“覆盖”,而不是使用“新”,那么当你调用弘(); 派生类的方法会因为多态性的调用。
Answer 3:
正如其他人所解释的,它是用来隐藏现有方法。 它是用于覆盖不是在父类中的虚拟的方法是有用的。
请记住,创造一个“新”成员不是多态。 如果你投的对象为基本类型,它不会使用派生类型的成员。
如果你有一个基类:
public class BaseClass
{
public void DoSomething() { }
}
然后派生类:
public class DerivedType : BaseClass
{
public new void DoSomething() {}
}
如果声明的类型DerivedType
然后抹上它,方法DoSomething()
是不是多态的,它会调用基类的方法,而不是得到的一个。
BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.
Answer 4:
从文档:
如果在派生类的方法的前面有新的关键字,则该方法被定义为独立的基类的方法的。
这是什么在实践中意味着:
如果你从另一个类继承,你必须共享,你可以把它定义为“新”相同签名的方法,使其独立于父类。 这意味着,如果你在“父”类的引用,那么此实现将被执行,如果你有孩子类,则该实现将执行的参考。
我个人尽量避免“新”的关键字,因为它通常意味着我有我的类层次结构错,但有些时候,它可能是有用的。 一个地方是对版本和向后兼容性。
有大量的信息在MSDN此 。
Answer 5:
这意味着该方法取代由基类继承相同名称的方法。 在你的情况,你可能没有该名称的方法在基类,这意味着新的关键字是完全多余的。
Answer 6:
长话短说-它不是必需的,它改变NO行为,纯粹是为有可读性。
这就是为什么在VS,你会看到一个小波浪,但你的代码将编译和运行完全正常,并符合市场预期。
人们想知道,如果这是真的值得创建new
的时候它的意思是开发人员的承认“是的,我知道我躲在一个基础方法的关键字,是的,我知道我没有做任何事情涉及到virtual
或overriden
(多态性) - 我真的只想创建它自己的方法”。
这是一个有点匪夷所思给我,但也许只是因为我来自一个Java
背景和有之间的根本区别C#
继承和Java
:在Java
,除非通过特定的方法是通过默认虚拟final
。 在C#
方法除非指定默认最终/混凝土virtual
。
Answer 7:
从MSDN :
使用new修饰符显式隐藏从基类继承的成员。 要隐藏继承成员,声明它使用相同的名称派生类,并用new修饰符修改它。
Answer 8:
小心这个疑难杂症的。
你必须在在碱类实现的接口中定义的方法。 然后创建一个派生类隐藏了接口的方法,但不明确声明派生类为实现该接口。 如果然后通过该界面的参考调用该方法,基类的方法将被调用。 但是,如果你的派生类不具体实现接口,那么它的方法将被调用,无论采用何种的引用类型。
interface IMethodToHide
{
string MethodToHide();
}
class BaseWithMethodToHide : IMethodToHide
{
public string MethodToHide()
{
return "BaseWithMethodToHide";
}
}
class DerivedNotImplementingInterface : BaseWithMethodToHide
{
new public string MethodToHide()
{
return "DerivedNotImplementingInterface";
}
}
class DerivedImplementingInterface : BaseWithMethodToHide, IMethodToHide
{
new public string MethodToHide()
{
return "DerivedImplementingInterface";
}
}
class Program
{
static void Main()
{
var oNoI = new DerivedNotImplementingInterface();
IMethodToHide ioNoI = new DerivedNotImplementingInterface();
Console.WriteLine("reference to the object type DerivedNotImplementingInterface calls the method in the class "
+ oNoI.MethodToHide());
// calls DerivedNotImplementingInterface.MethodToHide()
Console.WriteLine("reference to a DerivedNotImplementingInterface object via the interfce IMethodToHide calls the method in the class "
+ ioNoI.MethodToHide());
// calls BaseWithMethodToHide.MethodToHide()
Console.ReadLine();
var oI = new DerivedImplementingInterface();
IMethodToHide ioI = new DerivedImplementingInterface();
Console.WriteLine("reference to the object type DerivedImplementingInterface calls the method in the class "
+ oI.MethodToHide());
// calls DerivedImplementingInterface.MethodToHide()
Console.WriteLine("reference to a DerivedImplementingInterface object via the interfce IMethodToHide calls the method in the class "
+ ioI.MethodToHide());
// calls DerivedImplementingInterface.MethodToHide()
Console.ReadLine();
}
}
文章来源: new keyword in method signature