--- created: 2024-06-14T18:43:47 (UTC +08:00) tags: [] source: https://mooc1.chaoxing.com/mooc-ans/mooc2/work/view?courseId=206698159&classId=93333441&cpi=264745337&workId=33744044&answerId=52580920&enc=5cf082978f27e68ded5324105906df46 author: --- # 作业详情 > ## Excerpt > 以下代码模拟一个服务类,Server类实现了服务器的创建逻辑,子类只要在生成实例对象时传递一个端口号即可创建一个监听该端口的服务,该代码意图如下: --- ### 1\. (简答题, 20分)如何令一个数据类型的实例不可变(像string一样)? ### 2\. (简答题, 20分)在类里,利用get/set方法,或利用属性,都可以达到信息隐藏的效果。这两种方法有哪些差别,哪种方法功能更强? ### 3\. (简答题, 35分) 以下代码模拟一个服务类,Server类实现了服务器的创建逻辑,子类只要在生成实例对象时传递一个端口号即可创建一个监听该端口的服务,该代码意图如下: (1)通过SimpleServer的构造函数接收端口参数。 (2)子类的构造函数默认调用父类的构造函数。 (3)父类的构造函数调用子类的getPort方法获得端口号。 (4)父类构造函数建立端口监听机制(以Console.WriteLine替代)。 (5)对象创建完毕,服务监听启动,正常运行。 运行该程序,多运行几次,查看输出结果,**写出你认为的code 1 – 5的执行顺序,并解释原因**。     class Test     {         public int i = 0;         static void Main(string\[\] args)         {             Server s = new SimpleServer(1000);         }     }     abstract class Server     {         protected const int DEFAULT\_PORT = 40000;//code1         public Server()         {             int port = getPort();//code2             Console.WriteLine("Port: " + port);         }         protected abstract int getPort();     }     class SimpleServer : Server     {         private int port = 100;//code3         public SimpleServer(int \_port)         {             port = \_port;//code4         }         protected override int getPort()         {             return (new Random()).NextDouble() > 0.5 ? port : DEFAULT\_PORT;//code5         }     }