您可以选择在Swift的子类中继承的内容吗?

时间:2019-07-16 11:07:22

标签: swift inheritance initialization subclassing

我有一个基类(太空飞船),它具有一些变量和一个初始化程序。 我还有一个子类(UFO),它仅需要超类的变量之一。 当我尝试创建基本的UFO对象时,我得到:“调用var c = UFO()时缺少参数'weapon'的参数” 我意识到错误消息要求输入武器参数,但是如何(甚至可能?)创建不需要武器参数的基本UFO对象?

花了几个小时修改“ override”,“ init”和“ super”命令。我在SO和其他站点上已经阅读了很多文章,但是没有看到任何与我的情况类似的示例。再一次,我假设我想做的事情是可以开始的。

from pyspark.sql import SparkSession
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.feature import HashingTF, Tokenizer
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder

spark = SparkSession\
    .builder\
    .master('local[1]')\
    .getOrCreate()

# The target variable is foo
training = spark.createDataFrame([
    (0, "a b c d e spark", 1.0),
    (1, "b d", 0.0),
    (2, "spark f g h", 1.0),
    (3, "hadoop mapreduce", 0.0),
    (4, "b spark who", 1.0),
    (5, "g d a y", 0.0),
    (6, "spark fly", 1.0),
    (7, "was mapreduce", 0.0),
    (8, "e spark program", 1.0),
    (9, "a e c l", 0.0),
    (10, "spark compile", 1.0),
    (11, "hadoop software", 0.0)
], ["id", "text", "foo"])

# I set labelCol as foo
tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, labelCol="foo")
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

paramGrid = ParamGridBuilder() \
    .addGrid(hashingTF.numFeatures, [10, 100, 1000]) \
    .addGrid(lr.regParam, [0.1, 0.01]) \
    .build()

crossval = CrossValidator(estimator=pipeline,
                          estimatorParamMaps=paramGrid,
                          evaluator=BinaryClassificationEvaluator(),
                          numFolds=2)

# Run cross-validation, and choose the best set of parameters.
cvModel = crossval.fit(training) 

2 个答案:

答案 0 :(得分:1)

您可以做的是将weapon标记为optional String。另外,在init(weapon:)中,将weapon 默认值 用作nil,即

class Spaceship {
    var isUFO = false
    var weapon: String? //here...

    init(weapon: String? = nil) { //here...
        self.weapon = weapon
    }

    func printSomething() {
        print("Test")
    }
}

现在,您可以简单地创建带有和不带有class UFO的{​​{1}}对象,即

weapon

答案 1 :(得分:1)

首先,在使用继承时,您必须考虑“是”关系:UFO 宇宙飞船。因此,当每个太空飞船都有武器,而飞碟是太空飞船时,那么每个飞碟也必须有武器。

可以要做的是使您的武器成为可选武器,但我认为这在某种程度上是一种误用。另外,请重新考虑您的isUFO属性:

  • 宇宙飞船不应对特殊子类做出假设
  • 您可以使用is运算符检查Spacehip的动态类型

如果您不希望这种继承行为,则最好考虑其他事情,例如协议,在其中您仅指定某些行为而没有内存布局。