2017-02-22 56 views
0

У меня есть код SCALA из библиотеки с открытым исходным кодом, который выглядит следующим образом: -Scala-наиважнейшая значение переменной от признака

//somewhere in the open source code 
trait A 
{ 
val v1=callToSomeFunc() 

def usefulFunc1() {} 
def usefulFunc2() {} 
} 

Требуется: Я наследуя черту, и я не хочу, чтобы мой класс в любой ситуацию для вызова 'callToSomeFunc()' при наследовании признака A, но хотите использовать полезные функции Func1() и usefulFunc2() признака A.

Не могли бы вы помочь?

(Для тех, кто от искрового фона, я столкнулся множественные sparkcontexts ошибку, так как библиотека с открытым исходным кодом, который я наследующий определяет sparkcontext, который, безусловно, не то, что я хочу использовать)

Благодаря

+0

Что это нужно делать с Apache Спарк? –

+0

@JoeC, отредактировал вопрос – BigDataScholar

+0

, можете ли вы поделиться кодом, дающим вам проблемы? –

ответ

1

Вы можете использовать private[this] val v1=callToSomeFunc(), чтобы сузить область действия для вашего v1 только внутри черты. Ни один класс, расширяющий этот признак, не будет иметь к нему доступа.

+0

Это решение ОК, но не лучшее, как сейчас, мне нужно отредактировать код из библиотеки с открытым исходным кодом. – BigDataScholar

+0

Ну, если вы хотите запретить какой-либо класс, расширяющий «черту A», чтобы вызвать метод/поле признака, но это не ваша черта, вы не можете достичь этого. –

1

Вы можете переопределить val, унаследованный от признака.

override val v1 = somethingElse 

Никаких изменений не требуется.

Scala Cookbook from Safari

Код, который работает для меня в Scala 2.11.8

object TestIt extends App { 
    val jump = new TestIt 
    jump.sayWhat() 
} 
trait base { 
    val dontGoChangin: String = "dontGoChangin" 

    def sayWhat() = {println(dontGoChangin)} 
} 
class TestIt extends base{ 
    override val dontGoChangin: String = "toTryToPleaseMe" 
} 
+0

Как я понимаю, «я не хочу, чтобы мой класс в любой ситуации вызывал« callToSomeFunc() »при наследовании признака A', он не переопределит его, только защитит его доступность? –

+0

вы не можете переназначить val. – BigDataScholar

+0

Вы ознакомились с ссылкой на статью? – WillD