Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有趣的OOPS难题_C#_Oop_Puzzle - Fatal编程技术网

C# 有趣的OOPS难题

C# 有趣的OOPS难题,c#,oop,puzzle,C#,Oop,Puzzle,最近,我在一次采访中遇到了以下问题。起初我认为这个问题是错误的,但面试官提到有一个解决办法。鉴于这一类别: public class BaseHome { public static void Main() { Console.WriteLine("A"); } } 将以下内容写入控制台: B A C 规则: 请勿更改主功能 不要创建任何其他类 如何做到这一点?没有新类型。没有显式创建对象。在真正的控制台应用程序中工作 public class Bas

最近,我在一次采访中遇到了以下问题。起初我认为这个问题是错误的,但面试官提到有一个解决办法。鉴于这一类别:

public class BaseHome
{
    public static void Main()
    {
        Console.WriteLine("A");
    }
}
将以下内容写入控制台:

B
A
C
规则:

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

  • 如何做到这一点?

    没有新类型。没有显式创建对象。在真正的控制台应用程序中工作

    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
    -在同一行上

    (通过使用或直接转义序列,可根据后期编辑调整多行输出。)


    说明:

    解析静态属性(
    Console
    )而不是
    Console.WriteLine(“A”)
    中的类型,因为属性在此处隐藏类型;这就是为什么System.Console用于引用Console类本身的原因

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

    然后,该属性返回具有WriteLine的。然后调用,而不是控制台的静态WriteLine,并写入字符“A”(在“B”之后),因此结果是“BAC”


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

    假设您的意思是三行上的B A C(加上
    main
    方法名称上没有输入错误):


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

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

    除了重定向输出流,其他选项包括调用
    环境.Exit
    、抛出未经处理的异常,或者只是永远旋转。现在还不清楚该程序是否需要正常终止(或完全终止)。

    哈哈哈,我想出来了。创建一个静态属性

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


    @我也看到了。因此,解决方案可能是创建一个Main方法,不允许在键盘上键入任何内容或移动鼠标。这不是一个程序,我假设B和C是从名为BaseHome.Main的程序输出的,以提供AThis,这确实是CodeGolf.SE的一个问题。同意,这个问题很容易解决,只要让结构中的WriteLine接受一个它忽略的参数就可以了。@JanneMatikainen是的,已经解决了。还有一个比ken2k更糟糕的解决方案——不应该创建任何额外的类,这意味着在这个上下文中没有结构——是的,我认为这就是解决方案。我在考虑定时器,但这是更好的解决方案+1做得好。这项工作符合要求。+1惊人。我甚至都想不出出口!这个静态BaseHome()方法是什么?这是一个构造函数吗?@bodycountPP Ref.:“静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它。”这非常聪明!那太狡猾了。您还可以在静态构造函数中重定向控制台的输出流。看我的答案。解释,我要求一个@bodycountPP愿望实现了。这在我看来是相当巧妙的。聪明的回答。我喜欢这个,因为它表明你关注细节。
    BaseHome
    控制台程序/类可以很容易地成为
    静态的
    (而且,至少在我的经验中,它通常是静态的,或者至少不被视为可实例化的类)。如果类是静态的,您可以创建一个返回匿名类型的属性,但我不知道这是否违反了do-not-create-a-class约束:public static dynamic Console{get{Action WriteLine=s=>System.Console.WriteLine(“BCA”)返回新的{WriteLine};}@Dennis_E:好主意。如果不允许匿名类型(这似乎很有道理),您可以使用!这就是为什么C#是我最喜欢的语言;这么多漂亮的特征!聪明地简单地“断开”输出。
    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
        }
    
    }