抽象类vs调用基

时间:2015-08-09 20:22:37

标签: c# class abstract

我需要给用户一定程度的控制功能。所以我想部分实现一个用户可以完全实现的类。我提出了这个解决方案。

val hdfsTestNameNode = "localhost"
val hdfsMainNameNode = "172.31.32.228"

val hdfsNameNode = settingKey[String]("Namenode for the HDFS access")

val genTestHdfsConfig = Def.task {
  val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
  files.map({ hdfsTemplate =>
    val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in Test).value)
    val outputPath = resourceManaged.value / hdfsTemplate.getName
    IO.write(outputPath, config)
    outputPath
  })
}

val genCompileHdfsConfig = Def.task {
  val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
  files.map({ hdfsTemplate =>
    val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in Compile).value)
    val outputPath = resourceManaged.value / hdfsTemplate.getName
    IO.write(outputPath, config)
    outputPath
  })
}

Seq(
  hdfsNameNode in Test := hdfsTestNameNode,
  hdfsNameNode in Compile := hdfsMainNameNode,
  resourceGenerators in Compile += genCompileHdfsConfig.taskValue,
  resourceGenerators in Test += genTestHdfsConfig.taskValue
 )

另一个解决方案就是这个

private static final String VOICENAME = "kevin16";                                        
void mySpeak()
{
Voice voice;
VoiceManager vm = VoiceManager.getInstance();
voice = vm.getVoice(VOICENAME);
voice.allocate();
try{
voice.speak("Hi Mr Gaur Welcome to VITS. Thanks To choose Us");
}catch(Exception e){}
} 

我有什么理由可以使用其中一种解决方案吗?它是否提供某种优势?有人可以给我一些关于何时应该使用一种解决方案而不是另一种解决方案的见解?

1 个答案:

答案 0 :(得分:4)

您的第一个解决方案实际上是一个众所周知的模式,称为Template Method pattern。如果你想确保执行基本方法,这是一个很好的方法(因为FunctionA除了调用FunctionB之外可能做其他事情。)

在第二种解决方案中,覆盖方法可以不调用基本方法。根据您的情况,它可能是合适的,也可能不合适。