스칼라 클래스와 객체

클래스는 추상 객체이며, 객체 클래스의 특정 인스턴스이다. 클래스는 추상적이고 메모리를 차지하지 않고, 목적은 콘크리트입니다 저장 공간을 차지합니다. 클래스는 객체를 생성하기위한 청사진, 그것은 소프트웨어 정의 된 템플릿이있는 개체의 특정 유형의 방법 및 변수를 포함합니다.

다음과 같이 우리는 클래스의 객체를 생성하는 새로운 키워드를 사용할 수 있습니다, 예는 다음과 같습니다

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点: " + x);
      println ("y 的坐标点: " + y);
   }
}

클래스의 스칼라가 public으로 선언되지 않은, 스칼라 소스 파일은 여러 클래스를 가질 수 있습니다.

상기 방법은 리턴 값을 가지고 있지 이동: 상기 클래스의 예는 두 변수 X와Y,방법을정의한다.

클래스 정의 스칼라 매개 변수, 예를 들면 위의 XC로 불리는 클래스 매개 변수를 가질 수 있습니다, YC, 전체 클래스의 클래스 매개 변수에 액세스 할 수 있습니다.

그 다음 우리는 클래스 및 액세스 클래스 메소드와 변수의 인스턴스를 새 사용할 수 있습니다 :

import java.io._

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点: " + x);
      println ("y 的坐标点: " + y);
   }
}

object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);

      // 移到一个新的位置
      pt.move(10, 10);
   }
}

위의 코드의 구현, 출력은 :

$ scalac Test.scala 
$ scala Test
x 的坐标点: 20
y 的坐标点: 30

스칼라 상속

스칼라는 자바와 기본 클래스와 매우 유사 상속, 그러나 우리는 다음과 같은 점에주의해야합니다 :

  • 1, 재정의 수정을 사용해야 아닌 추상적 인 방법을 다시 작성하십시오.
  • 도 2는, 과거의 기본 클래스 생성자 기록 파라미터의 주요 생성자 가능하다.
  • 서브 클래스의 추상 슈퍼 클래스에서 재정의 된 경우 3. 당신은 override 키워드를 사용할 필요가 없습니다.

의 인스턴스를 살펴 보자 :

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点: " + x);
      println ("y 的坐标点: " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("x 的坐标点 : " + x);
      println ("y 的坐标点 : " + y);
      println ("z 的坐标点 : " + z);
   }
}

스칼라 사용하는 클래스를 상속하는 키워드를 확장합니다. 인스턴스 위치 클래스는 Point 클래스를 상속합니다. 포인트는 부모 클래스 (기본 클래스), 위치는 서브 클래스라고했다.

발 XC는 상위 클래스 필드를 다시보다 우선합니다.

모든 프로퍼티와 메소드는 상위 클래스를 상속 상속 스칼라는 부모 클래스를 상속 허용한다.

다음 예는 다음과 같다 :

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点 : " + x);
      println ("y 的坐标点 : " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("x 的坐标点 : " + x);
      println ("y 的坐标点 : " + y);
      println ("z 的坐标点 : " + z);
   }
}

object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

      // 移到一个新的位置
      loc.move(10, 10, 5);
   }
}

위의 코드의 구현, 출력은 :

$ scalac Test.scala 
$ scala Test
x 的坐标点 : 20
y 的坐标点 : 30
z 的坐标点 : 20

스칼라는 수정을 오버라이드 (override) 할 필요가 아닌 추상적 인 방법을 다시 작성하십시오.

class Person {
  var name = ""
  override def toString = getClass.getName + "[name=" + name + "]"
}

class Employee extends Person {
  var salary = 0.0
  override def toString = super.toString + "[salary=" + salary + "]"
}

object Test extends App {
  val fred = new Employee
  fred.name = "Fred"
  fred.salary = 50000
  println(fred)
}

위의 코드의 구현, 출력은 :

$ scalac Test.scala 
$ scala Test
Employee[name=Fred][salary=50000.0]

스칼라 단일 객체

스칼라,이 점은 고정되지 않지만, 또한 싱글 패턴을 달성하는 방법을 우리에게 제공하고, 그 키워드 오브젝트를 사용하는 것이다.

스칼라 클래스 정의에 부가하여, 하나의 케이스 모델에서 사용될 때, 또한 같은 이름의 대상 오브젝트의 정의는 그와 클래스 사이의 차이이며, 물체 오브젝트 파라미터를 취할 수 없다.

동반자 개체 : 싱글 개체 클래스와 같은 이름을 공유 할 때, 그는이 클래스의 동반자 개체라고합니다. 당신은 클래스와 동일한 소스 파일에서 관련 개체를 정의해야합니다. 이 클래스는 단일 객체 첨부 클래스라고 : 동반자 클래스입니다. 클래스와 그 동반자 개체는 서로에게 자신의 개인 회원에 액세스 할 수 있습니다.

Singleton 객체 인스턴스

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
   }
}

object Test {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint

      def printPoint{
         println ("x 的坐标点 : " + point.x);
         println ("y 的坐标点 : " + point.y);
      }
   }
}

위의 코드의 구현, 출력은 :

$ scalac Test.scala 
$ scala Test
x 的坐标点 : 10
y 的坐标点 : 20

관련 객체 인스턴스

/* 文件名:Marker.scala
 * author:本教程
 * url:www.w3write.com
 */

// 私有构造方法
class Marker private(val color:String) {

  println("创建" + this)
  
  override def toString(): String = "颜色标记:"+ color
  
}

// 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    def apply(color:String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    
    def getMarker(color:String) = { 
      if(markers.contains(color)) markers(color) else null
    }
    def main(args: Array[String]) { 
        println(Marker("red"))  
        // 单例函数调用,省略了.(点)符号  
		println(Marker getMarker "blue")  
    }
}

위의 코드의 구현, 출력은 :

$ scalac Marker.scala 
$ scala Marker
创建颜色标记:red
创建颜色标记:blue
创建颜色标记:green
颜色标记:red
颜色标记:blue