Я пытаюсь выучить Scala Объект s и Класс .Я пришел из Java , которая очень похожа на Scala, но не в синтаксисе.
В Java я бы создал такой класс:
public class Wallet {
private PublicKey publicKey;
private PrivateKey privateKey;
private int balance = 0;
public Wallet() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
}
public int getBalance(){
return balance;
}
}
Это определяет шаблон Wallet
объекта, который я могу создать в Java как:
Wallet wallet = new Wallet();
Это также создаст PrivateKey
и PublicKey
вконструктор Wallet
и назначить его соответствующим членам класса.
Я понимаю, что Scala использует слегка отличающийся подход, где классы - это просто шаблоны экземпляров объектов, а Object
- это объекты типа Singleton
, которые постоянно хранят информацию.
Кроме того, я обнаружил, что Object
часто используется в файле Class
в качестве объекта-компаньона в соответствии с этого поста .
Используя приведенный выше пример Wallet
, я пытаюсь воссоздать его в Scala .Это то, что у меня пока есть:
class Wallet {
var publicKey: PublicKey
var privateKey: PrivateKey
var balance: Int = 0
def this() {
this
val keyPair = KeyPairGenerator.getInstance("SHA-256").generateKeyPair()
privateKey = keyPair.getPrivate
publicKey = keyPair.getPublic
}
def getBalance(): Int = {
balance
}
}
Проблема:
Класс 'Кошелек' должен быть либо объявлен абстрактным, либо реализовать абстрактный член 'publicKey: PublicKey 'in' com.simple.blockchain.Wallet
Теперь это меня смущает.
В Java , этообычно было бы проблемой объявить, но не реализованные объекты в качестве членов класса, поэтому, если я попытаюсь добавить Companion Object , как предлагалось в предыдущем сообщении SO, и следуя их предложению с помощью:
object Wallet {
var privateKey: PrivateKey
var publicKey: PublicKey
}
Я получаю сообщение об ошибке:
Только классы могут быть объявлены, но неопределенные члены
TL; DR
Я быхотел бы иметь Wallet
Java код для Scala код, как мне этого добиться?
ОБНОВЛЕНИЕ (чтобы уточнить мой оригинальный вопрос)
Итак, ответ не отражает мой актуальный вопрос (что я имел в виду).Я попытаюсь уточнить.
Существуют различные конструкторы, поддерживаемые Scala.
Первичные конструкторы, которые вы найдете, как упомянуто @Josh здесь
class Person(name: String) {
var personName: String = name
}
и вторичные конструкторы будут (путем расширения примера @ Джоша), такие как:
def this() {
this("Unknown Person Name")
// additional code
}
Эти конструкторы обсуждаются здесь, в некоторых деталях , это делает для хорошего чтения.
Что меня интересует, так это.
Поскольку я объявил члена privateKey
и publicKey
, поэтому я хочу объявить больше членов в моем классе.Не все эти члены будут созданы при инициализации класса, но будут позже во время выполнения приложения.
Это ниже даст больше контекста тому, что я описал выше.Я создам экземпляр Wallet
, а на более поздней стадии позвоню wallet.generateKeys()
.
class Wallet {
var publicKey: PublicKey
var privateKey: PrivateKey
var balance: Int = 0
def generateKeys(): Unit = {
val keyPair = KeyPairGenerator.getInstance("SHA-256").generateKeyPair()
privateKey = keyPair.getPrivate
publicKey = keyPair.getPublic
}
def getBalance(): Int = {
balance
}
}
Для этого потребуется объявленная, но необработанная переменная во время выполнения, вплоть до точки, где она необходима.
Как этот будет определен в коде Scala.