新关键字如何用于隐藏方法?

时间:2016-07-01 07:46:02

标签: c#

我已阅读有关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关键字是否用于实例化对象?它用于为新创建的对象分配内存?那么如何使用它来隐藏方法呢?上面的例子是正确的吗?

4 个答案:

答案 0 :(得分:6)

new用于3种不同的事情。你可以说有3个不同的关键字具有相同的名称。

  1. 它是一个运算符,用于调用构造函数。示例:new object();
  2. 它是一个修饰符,用于隐藏基类成员的继承成员。例如:

    class Base {
        public void MyMethod() {
            //Do stuff
        }
    }
    
    class Derived : Base {
        public new void MyMethod() {
            //Do other stuff
        }
    }
    
  3. 它是泛型类型约束,用于指示泛型类型参数具有无参数构造函数。例如:

    class MyGenericClass<T> : where T : new() { ... }
    
  4. 来源: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.TextHWND 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

中阅读更多内容