a matter of experience—the only way to learn is to write code。 Extending the Lottery…Prediction System In Chapter 10; the IProcessor interface was a good first step because it solved the problem at hand。 The problem was to convert each line of text into another line of text。 However; in this chapter’s example; that interface is not enough。 We need to add two other methods: Initialize() and Destroy()。 We want to find the frequencies of an individual number in the drawn lotteries。 The orig inal interface method IProcessor。Process() is used to process an individual line of text; and the frequencies can be calculated only after all of the draws have been processed。 Thus; we add Destroy(); which is called after all of the lines of text have been read。 mon coding convention …………………………………………………………Page 419…………………………………………………………… CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 397 says that if you have a Destroy() method; you should have an Initialize() method that is called before the lines of text are processed。 Having extra requirements is not a problem and is fairly mon。 But you want to add the extra requirements without disrupting existing functionality。 After all; if some code works; you don’t want to break it because of additional requirements。 Thus; you don’t want to add the methods to the IProcessor interface like this: Public Interface IProcessor Function Initialize() As String Function Destroy() As String Function Process(ByVal input As String) As String End Interface This code is a no…no because you are breaking existing functionality。 Any class that imple ments IProcessor must now implement the methods Initialize() and Destroy(); even though those classes don’t need those methods。 Thus; when adding requirements; you should not change existing interfaces。 You create new interfaces and subclass the existing interfaces; like this: Public Interface IExtendedProcessor Inherits IProcessor Function Destroy() As String Function Initialize() As String End Interface The new interface IExtendedProcessor has the new methods Initialize() and Destroy(); but inherits the method Process()。 The old functionality still has only a single method; and the new functionality is free to implement either interface。 Adding new interfaces and new methods does not mean everything will work as is。 If you go back and look at the source code from Chapter 10; you’ll see that the IProcessor interface was used by the Bootstrap class。 So; if you want the IExtendedProcessor interface to be recog nized; you must update Bootstrap。 Updating Bootstrap is fine; because it does not mean that IProcessor implementations must be updated (or; at least; Bootstrap should not require that IProcessor implementations be updated)。 The original abbreviated implementation of Bootstrap is as follows: Imports System。IO Public Module Bootstrap Public Sub DisplayHelp() Console。WriteLine(〃You need help? Right now?〃) End Sub Public Sub Start(ByVal args As String(); _ ByVal processor As IProcessor) Dim reader As TextReader = Nothing Dim writer As TextWriter = Nothing …………………………………………………………Page 420…………………………………………………………… 398 CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q If (args。Length = 0) Then reader = Console。In writer = Console。Out ElseIf (args。Length = 1) Then If (args(0) = 〃…help〃) Then Bootstrap。DisplayHelp() Return End If reader = File。OpenText(args(0)) writer = Console。Out End If " Abbreviated writer。Write(processor。Process(reader。ReadToEnd())) End Sub End Module In the original implementation; the method Process() is called to read an input and write an output stream。 Since Initialize() and Destroy() should be called before and after the string is processed; the most logical location of each method would be before and after the processor。Process() method; like this: Imports System。IO Public Module Bootstrap Public Sub DisplayHelp() Console。WriteLine(〃You need help? Right now?〃) End Sub Public Sub Start(ByVal args As String(); _ ByVal processor As IProcessor) Dim reader As TextReader = Nothing Dim writer As TextWriter = Nothing If (args。Length = 0) Then reader = Console。In writer = Console。Out ElseIf (args。Length = 1) Then If (args(0) = 〃…help〃) Then Bootstrap。DisplayHelp() Return End If reader = File。OpenText(args(0)) writer = Console。Out End If " Abbreviated If TypeOf processor Is IExtendedProcessor Then writer。Write( _ DirectCast(processor; IExtendedProcessor)。Initialize()) End If …………………………………………………………Page 421…………………………………………………………… CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 399