(Kotlin)将参数从数据类构造函数传递给超级构造函数?

时间:2018-10-13 09:50:20

标签: inheritance constructor kotlin superclass data-class

我有一个抽象类:
PREFIX?=/usr/local/bin install_path=$(DESTDIR)$(PREFIX) encrypt_script=encrypt-file-aes256 decrypt_script=decrypt-file-aes256 distrib_name=openssl-file-encryption-decryption-shell-scripts .PHONY: check install uninstall distrib check: $(encrypt_script) $(decrypt_script) SHA512SUMS echo && sha512sum --check --status SHA512SUMS && ( echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo "ERROR: Files hash sum mismatch!" && echo && exit 1 ) install: check echo && [ -d $(install_path) ] || mkdir --parents $(install_path) install --verbose --mode=0755 --target-directory=$(install_path) $(encrypt_script) $(decrypt_script) uninstall: rm $(install_path)/$(encrypt_script) $(install_path)/$(decrypt_script) rmdir --ignore-fail-on-non-empty $(install_path) distrib: check $(encrypt_script) $(decrypt_script) Makefile SHA512SUMS if [ $$(id --user) -eq 0 ]; then ( echo && echo "Target 'distrib' has to be run as normal user!" && echo && exit 1 ) fi rm --force $(distrib_name).tar.xz rm --force $(distrib_name).tar.xz.asc rm --force --recursive $(distrib_name) mkdir $(distrib_name) # sha512sum $(encrypt_script) $(decrypt_script) > $(distrib_name)/SHA512SUMS cp $(encrypt_script) $(decrypt_script) Makefile SHA512SUMS $(distrib_name) wget --quiet --output-document=$(distrib_name)/LICENSE https://git.io/fxByv # https://raw.githubusercontent.com/burianvlastimil/openssl-file-encryption-decryption-shell-scripts/master/LICENSE wget --quiet --output-document=$(distrib_name)/README.md https://git.io/fxByJ # https://raw.githubusercontent.com/burianvlastimil/openssl-file-encryption-decryption-shell-scripts/master/README.md chmod 755 $(distrib_name)/$(encrypt_script) $(distrib_name)/$(decrypt_script) chmod 644 $(distrib_name)/Makefile $(distrib_name)/SHA512SUMS $(distrib_name)/LICENSE $(distrib_name)/README.md tar --create --file=$(distrib_name).tar $(distrib_name) xz --format=xz -9 --extreme --check=sha256 $(distrib_name).tar rm --force --recursive $(distrib_name) gpg --local-user 7D2E022E39A88ACF3EF6D4498F37AF4CE46008C3 --sign --armor --output $(distrib_name).tar.xz.asc --detach-sig $(distrib_name).tar.xz SHA512SUMS: sha512sum --check --status SHA512SUMS || sha512sum $(encrypt_script) $(decrypt_script) > SHA512SUMS

我有一个abstract class SuperClass(private val privateVal: Int)扩展了抽象类。 (data class

如何在DataClass构造函数中将privateVal用作参数,并将其传递给DataClass构造函数?

以下操作无效,因为数据类构造函数中仅允许SuperClassval s:
var

1 个答案:

答案 0 :(得分:2)

数据类的工作方式不同于常规类。正如您已经注意到的,数据类需要构造函数中的属性。数据类和继承很难,因为您不能像常规类那样传递值。从数据类继承也是不可能的。他们不支持_do_forkopen,这意味着它是最终的,不能继承。

实际上,如果您将数据类作为子级,则不可能:

abstract

但是,Kotlin确实支持抽象class Something(something: Int, else: Int) : Parent (something, else) var。如果您绝对需要数据类作为子类(尽管我不建议这样做;根据您的用例,使用常规类可能更好)。

val

这里它覆盖了构造函数中的val,这意味着它仍然可以工作。它是abstract class SuperClass { protected abstract val privateVal: Int } data class Overridden(override val privateVal: Int) : SuperClass() 而不是protected的原因是因为如果它是private,将无法继承。

尽管如此,我还是真的建议在这里使用常规类而不是数据类。