练习

  (1)下面的代码存在什么错误?

  1. public sealed class MyClass
  2. {
  3. // Class members.
  4. }
  5. public class myDerivedClass : MyClass
  6. {
  7. // Class members.
  8. }
答案:myDerivedClass派生于MyClass,但是MyClass是密封的,不能从MyClass中派生其他类。

  (2)如何定义不能创建的类(noncreatable class)?

答案:要定义不能创建的类,可以将其定义为静态类,或者将其所有构造函数定义为私有。

  (3)为什么不能创建的类仍旧有用?如何利用它们的功能?

  不能创建的类可以通过它们拥有的静态成员来使用。实际上,甚至可以通过这些成员获取这些类的实例,如下所示:

  1. class CreateMe
    {
    private CreateMe()
    {}

    static public CreateMe GetCreateMe()
    {
    return new CreateMe();
    }
    }


  这里,公共函数可以访问私有构造函数,因为它在同一个类的定义中。

  (4)在类库项目 Vehicles 中编写代码,实现本章前面讨论的 Vehicle 对象系列,其中有 9 个对象和 2 个接口需要实现。

答案:  为简单起见,下面的类定义显示为一个代码文件的一部分,而没有给每个类定义列出单独的代码文件:

  1. 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() 方法,并将结果输出到屏幕上。

答案:

  1. 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());
    }
    }
    }