zoukankan      html  css  js  c++  java
  • 一道很好玩的OOP面试题,今天比较有空,所有做了一下

    今天比较有兴致,看了一道比较有趣的面试题,做了一下,感觉挺好玩的,第一次用中文写代码

    /*题目:
     "假设这里是原始社会,有石头,2块石头互磨可以变成石刀,石刀可以去砍木头,木头被砍成木材,木材可以组成椅子,"   
     "请你用oo的思想把这些事物和他们之间的关系表达出来,但是要考虑到以后可能我会增加以下几点:"   
     "1.有可能我还想让石刀去砍椅子,把椅子砍成木材,"   
     "2.可能我还想让石头增加关系,例如互相砸,互相摔,而不只是磨,也可以变成石刀"   
     "3.也许我又要多添一百种不同的事物,再多添120种不同的关系..."
    */

    using System;

    namespace 原始社会 {

     abstract public class 石类{}
     abstract public class 木类{}

     public class 木材:木类{
      public 椅子 组装(){
       //木材组装成椅子
       Console.WriteLine("将木材组装成椅子");
       return new 椅子();
      }
     }
     public class 木头:木类{}
     public class 椅子:木类{}

     public class 石头:石类{}
     public class 刀:石类,I砍{
      public 木材 砍(木类 木类对象){
       //将木头,椅子等木类的东西砍成木材
       Console.WriteLine("将 {0} 砍成木材",木类对象.GetType().ToString());
       return new 木材();
      }
     }
     public interface I砍{
      木材 砍(木类 木类对象);
     }
     public interface I造刀{
      刀 造刀(石类 石头A,石类 石头B);
     }

     #region 造石變化點,制造策略不同
     //用造刀工厂来造刀,把变化点封装在工厂里面
     public class 造刀工厂{
      public static 刀 造刀(石类 石头A,石类 石头B,string 造刀策略){
       //根据造刀策略的名称将石头A和B造成刀
       try{
        Type type = Type.GetType("原始社会."+造刀策略,true,true);
        return ((I造刀)Activator.CreateInstance(type)).造刀(石头A,石头B);
       }catch(Exception e){
        Console.WriteLine(e.Message);
        return null;
       }
      }
     }
     
     //如果要增加造刀策略,则在这里增加就可以了
     public class 互磨造刀:I造刀{
      public 刀 造刀(石类 石头A,石类 石头B){
       Console.WriteLine("用互磨的方式将 {0} 和 {1} 制造成刀"
        ,石头A.GetType().ToString(),石头B.GetType().ToString());
       return new 刀();
      }
     }
     #endregion

     /// <summary>
     /// 用于测试的类。
     /// </summary>
     class TestClass {
      /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
      [STAThread]
      static void Main(string[] args) {
       //找两块石头
       石头 石头1 = new 石头();
       石头 石头2 = new 石头();
       //用“互磨造刀”的策略造了一把石刀
       刀 石刀1 = 造刀工厂.造刀(石头1,石头2,"互磨造刀");
       //找块木头
       木头 木头1 = new 木头();
       //用石刀把木头砍成木材
       木材 木材1 = 石刀1.砍(木头1);
       //把木材组装成椅子
       椅子 椅子1 = 木材1.组装();
      }
     }
    }

  • 相关阅读:
    怪怪设计论闲谈篇:职责与解耦的矛盾
    知识传播与社区讨论 : 兜售狗皮膏药的"软件先知"
    反弹和补遗:再论Bjarne Stroustrup的"基于对象"的含义
    回帖整理: 领域建模/表模块,Java/.NET 社区风格
    贫血或职责的讨论
    近期可能会研究和讨论的个人动向
    CLR寄宿(上) MSCOREE.DLL
    代码组(2) 成员条件
    说说emit(中)ILGenerator
    CLR寄宿(下) 托管宿主
  • 原文地址:https://www.cnblogs.com/seerlin/p/1210113.html
Copyright © 2011-2022 走看看