练习
(1)下面的代码存在什么错误?
public sealed class MyClass
{
// Class members.
}
public class myDerivedClass : MyClass
{
// Class members.
}
答案:myDerivedClass派生于MyClass,但是MyClass是密封的,不能从MyClass中派生其他类。
(2)如何定义不能创建的类(noncreatable class)?
答案:要定义不能创建的类,可以将其定义为静态类,或者将其所有构造函数定义为私有。
(3)为什么不能创建的类仍旧有用?如何利用它们的功能?
不能创建的类可以通过它们拥有的静态成员来使用。实际上,甚至可以通过这些成员获取这些类的实例,如下所示:
class CreateMe
{
private CreateMe()
{}
static public CreateMe GetCreateMe()
{
return new CreateMe();
}
}
这里,公共函数可以访问私有构造函数,因为它在同一个类的定义中。
(4)在类库项目 Vehicles
中编写代码,实现本章前面讨论的 Vehicle
对象系列,其中有 9 个对象和 2 个接口需要实现。
答案: 为简单起见,下面的类定义显示为一个代码文件的一部分,而没有给每个类定义列出单独的代码文件:
namespace Vehicles
{
public abstract class Vehicle {}
public abstract class Car : Vehicle {}
public abstract class Train : Vehicle {}
public interface IPassengerCarrier {}
public interface IHeavyLoadCarrier {}
public class SUV : Car, IPassengerCarrier {}
public class Pickup : Car, IPassengerCarrier, IHeavyLoadCarrier {}
public class Compact : Car, IPassengerCarrier {}
public class PassengerTrain : Train, IPassengerCarrier {}
public class FreightTrain : Train, IHeavyLoadCarrier {}
public class T424DoubleBogey : Train, IHeavyLoadCarrier {}
}
(5)创建一个控制台应用程序项目 Traffic
,它引用 Vehicle.dll
(在第(4)题中创建),其中包括函数 AddPassenger()
,它接受任何带有 IPassengerCarrier
接口的对象。要证明代码可以运行,使用支持这个接口的每个对象实例调用该函数,在每个对象上调用派生于 System.Object 的 ToString()
方法,并将结果输出到屏幕上。
答案:
using System;
using Vehicles;
namespace Traffic
{
class Program
{
static void Main(string[] args)
{
AddPassenger(new Compact());
AddPassenger(new SUV());
AddPassenger(new Pickup());
AddPassenger(new PassengerTrain());
}
static void AddPassenger(IPassengerCarrier Vehicle)
{
Console.WriteLine(Vehicle.ToString());
}
}
}