有趣的OOPS难题

时间:2014-06-06 09:08:12

标签: c# oop puzzle

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

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

将以下内容写入控制台:

B
A
C

规则:

  1. 请勿更改主要功能。
  2. 不要创建任何其他类。
  3. 如何做到这一点?

5 个答案:

答案 0 :(得分:49)

假设您的意思是三行上的B A C(加上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();
        }
    }
}

答案 1 :(得分: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
    }

}

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

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
    }

}

答案 2 :(得分: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();
    }
}

结果是BAC - 在同一行上不能少!

(根据帖子编辑,使用CurstorLeft/Top或直接转义序列,可以调整为多行输出。)


说明:

解析静态属性(Console)而不是Console.WriteLine("A")中的类型作为属性 shadow 这里的类型;这就是System.Console用于引用Console类本身的原因。

Console get-property导致写入控制台的副作用 - 它写入“__C”然后使用CR(回车)“返回行开始”并写入“B”,因此该行为“B_C” “,将光标留在”B“之后。

该属性然后返回具有WriteLine的TextWriter associated with the console。然后调用TextWriter's WriteLine,而不是Console的静态WriteLine,并写入字符“A”(在“B”之后),结果为“BAC”。

这利用特定于上下文的行为,因为它是understands how to move the cursor的控制台(例如带有“\ r”或其他光标定位)。

答案 3 :(得分:13)

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

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

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

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

答案 4 :(得分: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");
    }
}