今天比较有兴致,看了一道比较有趣的面试题,做了一下,感觉挺好玩的,第一次用中文写代码
/*题目:
"假设这里是原始社会,有石头,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.组装();
}
}
}