一道很好玩的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.组装();
  }
 }
}

原文地址:https://www.cnblogs.com/seerlin/p/1210113.html