我已阅读有关new
关键字的文章。它说它用于隐藏方法。这是他们给出的例子:
using System;
namespace ConsoleApplication3
{
class SampleA
{
public void Show()
{
Console.WriteLine("Sample A Test Method");
}
}
class SampleB:SampleA
{
public void Show()
{
Console.WriteLine("Sample B Test Method");
}
}
class Program
{
static void Main(string[] args)
{
SampleA a = new SampleA();
SampleB b = new SampleB();
a.Show();
b.Show();
a = new SampleB();
a.Show();
Console.ReadLine();
}
}
}
输出:
样品A测试方法
样品B测试方法
样品A测试方法
所以我的问题是new
关键字是否用于实例化对象?它用于为新创建的对象分配内存?那么如何使用它来隐藏方法呢?上面的例子是正确的吗?
答案 0 :(得分:6)
new
用于3种不同的事情。你可以说有3个不同的关键字具有相同的名称。
new object();
它是一个修饰符,用于隐藏基类成员的继承成员。例如:
class Base {
public void MyMethod() {
//Do stuff
}
}
class Derived : Base {
public new void MyMethod() {
//Do other stuff
}
}
它是泛型类型约束,用于指示泛型类型参数具有无参数构造函数。例如:
class MyGenericClass<T> : where T : new() { ... }
来源:new
答案 1 :(得分:3)
不是用于实例化对象的
new
关键字吗?
是的。除其他外。
然后如何使用它完成方法隐藏?
方法和属性定义上下文中的new
关键字具有与用于实例化对象的new
关键字不同的含义。该上下文中的new
关键字表示该特定方法或属性的继承树有一个新的开始。这就是全部。
答案 2 :(得分:2)
然后如何使用它完成方法隐藏?以上就是例子 正确的吗?
编程语言的语法,语法和语义只是一组任意的约定和规范。也就是说,C#可以发明一个,两个或几十个给定关键字的用法,例如new
。
在类成员声明期间使用new
时,表示您正在重复使用标识符:
public class A
{
public string Text { get; set; }
}
public class B : A
{
new public int Text { get; set; }
}
正如您可以检查上面的代码示例,B
也实现了Text
属性,但由于A
派生了一个Text
属性,因此有一个new
属性命名冲突。
所谓的Text
关键字可用于重复使用Text
标识符,并且能够实现另一个属性Text
,该属性可能与基础中实现的属性完全不同类。请注意B
上的int
类型为public class A
{
public virtual string Text { get; set; }
}
public class B : A
{
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}
}
!
这里最重要的一点是,重用标识符与使用多态性不同,其中类方法或属性覆盖必须与基类的成员签名匹配:
public class A
{
public string Text { get; set; }
}
public class B : A
{
new public int Text { get; set; }
}
B b = new B();
b.Text = 4;
// Upcast B to A
A a = b;
a.Text = "Bye bye";
Console.WriteLine(a.Text); // Output: Bye bye
Console.WriteLine(b.Text); // Output: 4
此外,重复使用的标识符很危险:
A.Text
查看Text的输出。由于重复使用标识符不是多态,并且在上面的情况下两者都是完全不同的属性,因此可以单独设置B.Text
和HWND hwnd = FindWindow(0,("my programme window name"));
while(hwnd == nullptr) {
cout << "window not found!" << endl;
Sleep(1000);
system("cls");
hwnd = FindWindow(0,("my programme window name"));
}
。
答案 3 :(得分:1)
要隐藏继承的成员,请使用相同的成员名称在派生类中声明它,并使用 new 关键字对其进行修改。例如:
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
// Hide field 'x'.
new public static int x = 100;
static void Main()
{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
/*
Output:
100
55
22
*/
您可以在here
中阅读更多内容