有趣的OOPS难题

use*_*387 30 c# oop puzzle

最近,我在接受采访时遇到了以下问题.最初我认为这个问题是错的,但面试官提到有一个解决方案.鉴于此类:

public class BaseHome
{
    public static void Main()
    {
        Console.WriteLine("A");
    }
}
Run Code Online (Sandbox Code Playgroud)

将以下内容写入控制台:

B
A
C
Run Code Online (Sandbox Code Playgroud)

规则:

  1. 请勿更改主要功能.
  2. 不要创建任何其他类.

如何才能做到这一点?

ken*_*n2k 49

假设你的意思是BAC三行(加上main方法名称没有拼写错误):

namespace ConsoleApplication1
{
    public class BaseHome
    {
        static BaseHome()
        {
            Console.WriteLine("B");

            AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
        }

        public static void Main()
        {
            Console.WriteLine("A");
        }

        private static void OnProcessExit(object sender, EventArgs e)
        {
            Console.WriteLine("C");
            Console.Read();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1干得好.这可以按要求工作. (4认同)
  • +1很棒.我甚至想不到ProcessExit! (4认同)
  • 是的,我认为这是解决方案.我在考虑计时器,但这是更好的解决方案 (2认同)
  • @bodycountPP参考 [Static Constructors](http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx):"静态构造函数用于初始化任何静态数据,或执行需要执行一次的特定操作仅在创建第一个实例或引用任何静态成员之前自动调用它." (2认同)

Den*_*s_E 25

哈哈哈,我明白了.创建一个静态属性!

public class BaseHome
{
    public static void Main()
    {
       Console.WriteLine("A");
    }

    public static BaseHome Console
    {
        get{ return new BaseHome(); }
    }

    public void WriteLine(string s) {
        System.Console.WriteLine("BCA"); //Or multiple lines if you like
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:或者,呃,只是一个字段

public class BaseHome
{
    static BaseHome Console = new BaseHome();

    public static void Main()
    {
       Console.WriteLine("A");
    }

    public void WriteLine(string s) {
        System.Console.WriteLine("BCA"); //Or multiple lines if you like
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 聪明的回答.我喜欢这个,因为它表明你注意细节.`BaseHome`控制台程序/类可以_easily_是`static`(并且,至少在我的经验中,它通常是静态的,或者至少不被视为可实例化的类).这利用了这个细节,否则将无法工作. (4认同)

use*_*740 17

没有新的类型.没有显式创建对象.适用于真正的控制台应用程序.

public class BaseHome
{
    static System.IO.TextWriter Console
    {
        get
        {
            System.Console.Write("  C\rB");
            return System.Console.Out;
        }
    }
    public static void Main()
    {
        Console.WriteLine("A");
        // System.Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是BAC- 在同一条线上不下!

(根据后期编辑,可以使用CurstorLeft/Top或直接转义序列来调整多行输出.)


说明:

静态属性(Console)被解析而不是类型in Console.WriteLine("A")属性阴影这里的类型; 这就是System.Console用于引用Console类本身的原因.

Console get-property导致写入控制台的副作用 - 它写入"__C"然后使用CR(回车)"返回到行开始"并写入"B",因此该行为"B_C",离开"B"后的光标.

然后,该属性返回具有WriteLine 的控制台关联TextWriter.该TextWriter的的的WriteLine,不是控制台的静态的WriteLine,然后调用和字符"A"被写入(在"B"),这样的结果是"BAC".

这利用了特定于上下文的行为,因为它是理解如何移动光标的控制台(例如,使用"\ r"或其他光标定位).


Mik*_*ray 13

只需要一个静态构造函数:

public class BaseHome
{
    static BaseHome()
    {
        Console.WriteLine("B\nA\nC");
        Console.SetOut(System.IO.TextWriter.Null);
    }

    public static void Main()
    {
        Console.WriteLine("A");
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是重定向输出流,其他选项包括调用Environment.Exit,抛出未处理的异常,或者只是永远旋转.目前还不清楚该程序是否需要正常终止(或根本不需要).


And*_*nov 5

struct ConsoleStruct
{
    private string _text;
    public ConsoleStruct(string text)
    {
        _text = text;
    }

    public void WriteLine(string txt)
    {
        Console.WriteLine(_text);
    }
}
class Program
{
    private static ConsoleStruct Console = new ConsoleStruct("B A C");
    static void Main(string[] args)
    {
        Console.WriteLine("A");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,不应该创建任何额外的类,暗示没有结构 (3认同)
  • 你编辑了Main. (2认同)