2016-07-01 6 views
4

Ich habe einen Artikel über das Stichwort new gelesen. Es sagt, es wird verwendet, um Methoden zu verstecken. Dies ist beispielsweise geben sie:Wie wird das neue Schlüsselwort verwendet, um eine Methode zu verbergen?

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

Ausgang:

Probe A Testmethode

Probe B Testmethode

Probe A Testmethode

Also meine Frage ist nicht das Schlüsselwort new, das für eine Instanz verwendet wurde Objekt? und es verwendet, um Speicher für neu erstellte Objekte zuzuweisen? Wie kann dann das Verstecken von Methoden durchgeführt werden? Und ist das obige Beispiel korrekt?

+0

Können Sie einen Link posten? – JDE

+0

Das "neue" Wort hat in C# mehrere Bedeutungen. Eine davon ist das Verbergen einer Basisklassenmethode in einer Unterklasse. – Alex

+1

Sehen Sie, ob dies hilft - http://StackOverflow.com/questions/30208180/new-keyword-and-method-hiding?rq=1 – Sanket

Antwort

5

new für 3 verschiedene Dinge verwendet wird. Sie könnten sagen, dass es 3 verschiedene Keywords mit demselben Namen gibt.

  1. Es ist ein Operator, um Konstruktoren aufzurufen. Beispiel: new object();
  2. Es ist ein Modifizierer, der verwendet wird, um ein geerbtes Mitglied aus einem Basisklassenmitglied auszublenden. Beispiel:

    class Base { 
        public void MyMethod() { 
         //Do stuff 
        } 
    } 
    
    class Derived : Base { 
        public new void MyMethod() { 
         //Do other stuff 
        } 
    } 
    
  3. Es ist eine generische Typ Einschränkung verwendet, um anzuzeigen, dass ein generischer Typ Parameter einen parameterlosen Konstruktor hat. Beispiel:

    class MyGenericClass<T> : where T : new() { ... } 
    

Quelle: new

+0

ich verstehe, was du sagen willst.aber in Beispiel ich in Frage gestellt gibt es kein neues Schlüsselwort in der Show-Methode der abgeleiteten Klasse.also wie Objekt von SampleB aufrufen show() Methode von SampleA? –

+0

@NeelamPrajapati Das Schlüsselwort 'new' ist impliziert. Es ist kein Fehler es wegzulassen, aber es ist da, auch wenn Sie es nicht eingeben. –

+0

dann in der Hauptmethode gibt es 2 Objekte von sampleB.first ist salling Show() von sampleB. und zweitens ruft Show() von SampleA.why? –

3

Wird das Schlüsselwort new nicht verwendet, um ein Objekt zu instanziieren?

Ja ist es. Unter anderem.

dann wie kann das Verstecken der Methode damit getan werden?

Das new Stichwort im Zusammenhang mit der Methoden- und Eigenschaftsdefinitionen eine andere Bedeutung hat als die new Schlüsselwort verwendet, um Objekte zu instanziieren. Das Schlüsselwort new in diesem Kontext gibt an, dass der Vererbungsbaum dieser bestimmten Methode oder Eigenschaft neu gestartet wurde. Das ist alles.

+0

Insteas von "Start des Vererbungsbaums" Ich würde nur sagen, dass * es einen Identifikator * wieder verwendet, nicht wahr? –

+0

Nun, ja. Aber es bricht den Vererbungsbaum, was meiner Meinung nach eine Schlüsselrolle beim Missverständnis von OP spielte. –

+0

Yeah, du hast Recht –

1

Um eine geerbte Mitglied, erklären sie in der abgeleiteten Klasse unter Verwendung des gleichen Mitgliedsnamen, und ändern Sie es mit dem neuen Stichwort zu verstecken. Zum Beispiel:

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 
*/ 

können Sie mehr lesen in here

1

Dann, wie Verfahren Versteck getan, um es mit werden kann? Und ist das obige Beispiel korrekt?

Programmiersprache Syntax, Grammatik und Semantik sind nur eine willkürliche Reihe von Konventionen und Spezifikationen. Das heißt, C# kann ein, zwei oder Dutzende von Verwendungen eines gegebenen Schlüsselworts wie new erfinden.

Wenn new während einer Klassenelementdeklaration verwendet wird, bedeutet dies, dass Sie wieder mit einer Kennung:

public class A 
{ 
    public string Text { get; set; } 
} 

public class B : A 
{ 
    new public int Text { get; set; } 
} 

Wie Sie oben Codebeispiel einchecken, B auch implementiert eine Text Eigenschaft, aber seit leitet sich von A ab, die auch eine Text Eigenschaft definiert hat, gibt es eine Namenskollision.

Das sogenannte new Schlüsselwort kann Text Kennung und in der Lage zu implementieren einem anderen Eigenschaft Text, die sich benehmen können völlig anders als die in der Basisklasse implementiert wiederverwenden verwendet werden. Sehen Sie, dass Text auf B vom Typ int ist!

Der wichtigste Punkt hier ist, dass Kennungen wiederverwenden ist nicht die gleiche wie Polymorphismus, wo eine Klasse Methode oder Eigenschaft überschreiben muss die Basisklasse Unterschrift Mitglied entsprechen:

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; } 
    } 
} 

Auch re- verwendete Bezeichner sind gefährlich:

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 

Siehe Ausgabe von Text. Da die Wiederverwendung von Kennungen nicht Polymorphismus ist, und im obigen Fall beide völlig unterschiedliche Eigenschaften sind, gibt es eine A.Text und B.Text, die separat festgelegt werden können.

+0

"Der wichtigste Punkt hier ist, dass die Wiederverwendung von Bezeichnern ist nicht das Gleiche wie die Verwendung von Polymorphie, wo eine Klassenmethode oder Eigenschaft überschreiben Basisklasse 'Mitglied Unterschrift" Das war der Schlüssel zu mir zu verstehen, warum 'neu 'Schlüsselwort in diesem Kontext ist nützlich. Vielen Dank. – juniorgarcia

+0

@juniorgarcia Kein Problem! : D –

Verwandte Themen