19 Stimmen

C# Potenzielle Interviewfrage ... zu schwer?

Ohne diesen Code auszuführen, identifizieren Sie bitte, welche Foo-Methode aufgerufen wird:

class A
{
   public void Foo( int n )
   {
      Console.WriteLine( "A::Foo" );
   }
}

class B : A
{
   /* beachten Sie, dass A::Foo und B::Foo überhaupt nicht zusammenhängen */
   public void Foo( double n )
   {
      Console.WriteLine( "B::Foo" );
   }
}

static void Main( string[] args )
{
   B b = new B();
   /* welches Foo wird gewählt? */
   b.Foo( 5 );
}

Welche Methode? Und warum? Kein Mogeln, indem Sie den Code ausführen.

Ich habe dieses Rätsel im Internet gefunden; ich mag es und denke daran, es als Interviewfrage zu verwenden... Meinungen?

EDIT: Ich würde einen Bewerber nicht dafür beurteilen, wenn er dies falsch beantwortet, sondern es als Möglichkeit nutzen, eine umfassendere Diskussion über C# und CLR selbst zu eröffnen, damit ich ein gutes Verständnis der Fähigkeiten des Bewerbers erlangen kann.

Quelle: http://netpl.blogspot.com/2008/06/c-puzzle-no8-beginner.html

35 Stimmen

Wenn mich jemand fragt, werde ich sagen, du hättest die Main-Methode in einer Klasse schreiben sollen :))

0 Stimmen

Kann mir jemand erklären, warum die Basisklassenmethode aufgerufen wird, wenn wir den Parameter vom Typ int auf double (A.Foo) und von double auf int (B.Foo) ändern und den Input als double übergeben?

7voto

Keith Punkte 141163

Nicht wirklich fair als Interviewfrage, da es ein bisschen eine Trickfrage ist. Die gute Antwort, die ich von einem Bewerber hören möchte, wäre eher in die Richtung "Das muss refaktoriert werden".

Es sei denn, Sie suchen jemanden einstellen, um an Compilern zu arbeiten, bin ich mir nicht sicher, ob Sie so tief in die CLR gehen müssen.

Bei Interviewfragen suche ich nach Dingen, die das Verständnis des Coders in ihrer Antwort zeigen. Das ist eher eine Eigenheit/Rätsel.

0 Stimmen

Deine Antwort ist die beste. Wenn ich mit einer solchen Frage konfrontiert werde, würde ich versuchen, eine Antwort zu finden, aber letztendlich meine Meinung äußern, dass es eine schlechte Praxis ist, solche Rätsel im Code zu haben, und mich für eine andere Lösung entscheiden.

6voto

Mike Rosenblum Punkte 11898

Dies ist eigentlich eine Trickfrage.

Die Antwort ist mehrdeutig, was "sollte" passieren. Sicher, der C#-Compiler nimmt es aus dem Bereich der Mehrdeutigkeit in das Konkrete; jedoch, da diese Methoden sich gegenseitig überladen und weder überschrieben noch verdeckt sind, ist es vernünftig anzunehmen, dass hier der "beste Argumentumfang" gelten sollte und daher zu dem Schluss kommen, dass A::Foo(int n) aufgerufen werden sollte, wenn eine Ganzzahl als Argument übergeben wird.

Um zu beweisen, dass es unklar ist, was "sollte" passieren, führt genau derselbe Code, wenn er in VB.NET ausgeführt wird, zu entgegengesetzten Ergebnissen:

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click
        Dim b As New B
        b.Foo(5)   ' A::Foo
        b.Foo(5.0) ' B::Foo
    End Sub
End Class

Class A
    Sub Foo(ByVal n As Integer)
        MessageBox.Show("A::Foo")
    End Sub
End Class

Class B
    Inherits A

    Overloads Sub Foo(ByVal n As Double)
        MessageBox.Show("B::Foo")
    End Sub
End Class

Ich bin mir bewusst, dass ich C#-Programmierern die Möglichkeit gebe, über VB.NET herzuziehen, weil es sich nicht an C# hält. Aber meiner Meinung nach könnte man sehr überzeugende Gründe dafür anführen, dass es VB.NET ist, das hier die richtige Interpretation trifft.

Weiterhin suggeriert IntelliSense in der C#-IDE, dass es zwei Überladungen für die Klasse B gibt (weil es sie gibt, oder zumindest geben sollte!), aber die Version B.Foo(int n) kann tatsächlich nicht aufgerufen werden (nicht ohne vorher explizit in eine Klasse A zu casten). Das Ergebnis ist, dass die C#-IDE tatsächlich nicht mit dem C#-Compiler synchron ist.

Eine andere Möglichkeit, dies zu betrachten, ist, dass der C#-Compiler eine beabsichtigte Überladung in eine verdeckte Methode umwandelt. (Das scheint mir nicht die richtige Wahl zu sein, aber das ist offensichtlich nur meine Meinung.)

Als Interviewfrage denke ich, dass es in Ordnung sein kann, wenn man interessiert ist, eine Diskussion über die hier aufgezeigten Probleme zu führen. Was das "richtig" oder "falsch" angeht, so finde ich, dass die Frage an eine Trickfrage grenzt, die leicht übersehen oder sogar aus den falschen Gründen richtig beantwortet werden könnte. Tatsächlich ist die Antwort auf die Frage, was "sollte", sehr umstritten.

1 Stimmen

+1 für die richtige Antwort aus falschen Gründen. Deshalb ist Trivia so schlecht. Man bekommt einen Idioten, der auf dem Papier gut aussieht. Besser, Designfragen zu stellen.

3voto

Ryan Lundy Punkte 195074

Ich finde das ist eine schreckliche Frage. Ich denke, jede Frage ist eine schreckliche Frage, wenn die wirkliche Antwort lautet: "Führe es aus und schau!".

Wenn ich das in meinem echten Leben wissen müsste, würde ich genau das tun: Ein Testprojekt erstellen, es eingeben und herausfinden. Dann muss ich mir keine Gedanken über abstraktes Denken oder die Feinheiten der C#-Spezifikation machen.

Nur heute bin ich auf eine solche Frage gestoßen: Wenn ich dieselbe typisierte DataTable zweimal mit derselben Zeile fülle, was passiert dann? Eine Kopie der Zeile oder zwei? Und wird es die erste Zeile überschreiben, selbst wenn ich sie geändert habe? Ich dachte darüber nach, jemanden zu fragen, aber dann wurde mir klar, dass ich einfach ein Testprojekt starten könnte, das ich bereits hatte und das DataSets verwendete, eine kleine Methode schreiben und es ausprobieren.

Antwort:

...ah, aber wenn ich es dir sage, verpasst du den Punkt. :) Der Punkt ist, in der Programmierung müssen diese Dinge nicht als hypothetisch betrachtet werden, und du solltest es nicht tun, wenn sie vernünftig getestet werden können.

Also ich denke, das ist eine schreckliche Frage. Würdest du nicht lieber einen Entwickler einstellen, der es ausprobiert und dann weiß, was passiert, anstatt einen Entwickler, der versuchen wird, es aus seiner verblassenden Erinnerung hervorzukramen, oder der jemand anderen fragt und eine möglicherweise falsche Antwort akzeptiert?

0 Stimmen

Ich glaube nicht, dass "führe es aus und sieh" alles ist, was dazu gehört. Es existieren Code-Schnipsel, die auf verschiedenen Compiler/Run-Time-Versionen unterschiedliche Ergebnisse liefern (obwohl dies nicht einer von ihnen ist). "Es hat auf meinem Computer funktioniert" ist keine ideale Position, wenn mein Code später fehlschlägt.

0 Stimmen

Mein üblicher Ansatz wäre zunächst, es auszuführen, um zu sehen, was ich erhalte, und dann mit diesem Wissen die Spezifikation zu untersuchen, um festzustellen, ob das, was ich bekommen habe, garantiert immer passiert.

1 Stimmen

Und dennoch...könnt ihr es auch auf anderen Compilern oder Versionen "ausführen und sehen"! Und wenn "es auf meinem System funktioniert" nicht ausreicht, liegt das offensichtlich daran, dass es, wenn ihr es auf einem anderen System "ausführt und seht", nicht funktioniert. Letztendlich wird Real-World-Testing immer die Theorie übertreffen.

3voto

Mark Brackett Punkte 83046

Das ist eine lächerliche Frage - ich könnte sie in weniger als 60 Sekunden mit dem Snippet Compiler beantworten, und wenn ich jemals in einem Code-Bestand gearbeitet hätte, der von dieser Funktionalität abhängt, würde sie schnell ausgelagert werden.

Die beste Antwort lautet "das ist ein dummer Designfehler, mach das nicht und du musst nicht die Sprachspezifikation durchsuchen, um zu wissen, was passiert".

Wenn ich der Bewerber wäre, würde ich sehr positiv über dein Geek-Trivialwissen denken und dich vielleicht zum nächsten Spiel von Geek Trivial Pursuit einladen. Aber ich bin mir nicht sicher, ob ich mit/dir arbeiten möchte. Wenn das dein Ziel ist, frage ruhig weiter.

  • Beachte, dass in einer informellen Situation Geek-Trivia wie diese Spaß machen und unterhaltsam sein kann. Aber für den Bewerber ist ein Vorstellungsgespräch alles andere als lustig oder informell - warum also das Ganze mit trivialen Fragen weiter aufstacheln, die der Bewerber nicht ernst nimmt?

0 Stimmen

Also ist deine Antwort im Grunde, dass es nicht wichtig ist, ob jemand weiß, wie seine Programmiersprache funktioniert?

1 Stimmen

@Bobby - An den extremen Rändern? Ja, ich würde sagen, es spielt keine Rolle. Ich hätte viel lieber jemanden, der logisch denken kann, als einen Spezifikations-Freak.

0 Stimmen

@BobbyShaftoe Gute Programmierer können Eigenheiten einer Sprache lernen. Du hast X Zeit in einem Interview. Es ist am besten, sich darauf zu konzentrieren, ob du einen guten Programmierer hast, anstatt einen Typen, der Kompilierungsprobleme erkennen kann. Ich ziehe es vor, dass ein Kerl ein gutes Design für ein Haus entwirft, anstatt einen Kerl, der niemals aus Versehen die falsche Schraube für eine Sekunde auswählt und ein nicht nutzbares Haus baut.

2voto

Mark Ransom Punkte 283960

Dies riecht nach einer Trickfrage für mich. Wenn Sie die Sprache schon lange genug verwenden, sind Sie wahrscheinlich auf das Problem gestoßen und kennen die Antwort; aber wie lange ist lange genug?

Es handelt sich auch um eine Frage, bei der Ihr Hintergrund gegen Sie arbeiten könnte. Ich weiß, dass in C++ die Definition in B die Definition in A verstecken würde, aber ich habe keine Ahnung, ob es in C# genauso funktioniert. Im echten Leben würde ich wissen, dass es sich um einen fragwürdigen Bereich handelt und versuchen, es nachzuschlagen. In einem Interview könnte ich versuchen zu raten, weil ich unter Druck gesetzt wurde. Und ich würde wahrscheinlich falsch liegen.

0 Stimmen

Im echten Leben würde ich es ausprobieren und sehen, was passiert ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X