sototh 1 tháng trước cách đây
commit
a6496b1da7
8 tập tin đã thay đổi với 155 bổ sung0 xóa
  1. 15 0
      exts.iml
  2. 27 0
      src/Circle.kt
  3. 5 0
      src/Figure.kt
  4. 23 0
      src/Main.kt
  5. 4 0
      src/Movable.kt
  6. 41 0
      src/Rect.kt
  7. 28 0
      src/Square.kt
  8. 12 0
      src/Transforming.kt

+ 15 - 0
exts.iml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/testResources" type="java-test-resource" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="KotlinJavaRuntime" level="project" />
+  </component>
+</module>

+ 27 - 0
src/Circle.kt

@@ -0,0 +1,27 @@
+// TODO: дополнить определение класса размерами и позицией
+class Circle(var x:Float, var y: Float, var r: Float) : Figure(0), Transforming {
+    override fun area(): Float {
+        return (3.14*r*r).toFloat();
+    }
+
+    override fun resize(zoom: Int) {
+        r *= zoom;
+    }
+
+    override fun rotate(direction: RotateDirection, centerX: Int, centerY: Int) {
+        var tmpX = x - centerX
+        var tmpY = y - centerY
+        if (direction == RotateDirection.CounterClockwise){
+            val buf = -tmpY
+            tmpY = tmpX
+            tmpX = buf
+        }else{
+            val buf = tmpY
+            tmpY = - tmpX
+            tmpX = buf
+        }
+
+        x = tmpX + centerX;
+        y = tmpY + centerY;
+    }
+}

+ 5 - 0
src/Figure.kt

@@ -0,0 +1,5 @@
+    // если хотя бы есть один метод абстрактный (без реализации), класс объявляется абстрактным
+abstract class Figure(val id: Int) {
+    // мы не знаем площади абстрактной фигуры, но это не мешает нам определить метод
+     abstract fun area(): Float
+}

+ 23 - 0
src/Main.kt

@@ -0,0 +1,23 @@
+fun main() {
+
+    // интерфейсы удобно использовать в коллекциях
+    val figures: Array<Movable>
+    val movable: Movable = Rect(0,0,1,1)
+    movable.move(1,1)
+    // переменной базового класса
+    val f: Rect = Rect(0,0,1,1)
+    val f2: Circle = Circle(1f,2f,2f)
+
+    println("Rect area:${f.area()} x:${f.x} y:${f.y} width:${f.width} height:${f.height}");
+    f.resize(10)
+    println("Rect after resize ${f.area()} x:${f.x} y:${f.y} width:${f.width} height:${f.height}")
+
+    println("Circle area:${f2.area()} x:${f2.x} y:${f2.y} r:${f2.r}");
+    f2.resize(10)
+    println("Circle after resize area:${f2.area()} x:${f2.x} y:${f2.y} r:${f2.r}");
+    f2.rotate(RotateDirection.Clockwise,1,1)
+    println("Circle after rotation area:${f2.area()} x:${f2.x} y:${f2.y} r:${f2.r}");
+
+    println(f2.area())
+
+}

+ 4 - 0
src/Movable.kt

@@ -0,0 +1,4 @@
+interface Movable {
+    // заказ на реализацию некоторых функций
+    fun move(dx: Int, dy: Int)
+}

+ 41 - 0
src/Rect.kt

@@ -0,0 +1,41 @@
+// сочетание определения класса и конструктора одновременно объявляет переменные и задаёт их значения
+class Rect(var x: Int, var y: Int, var width: Int, var height: Int) : Movable, Figure(0), Transforming {
+    // TODO: реализовать интерфейс Transforming
+    var color: Int = -1 // при объявлении каждое поле нужно инициализировать
+
+    lateinit var name: String // значение на момент определения неизвестно (только для объектных типов)
+    // дополнительный конструктор вызывает основной
+    constructor(rect: Rect) : this(rect.x, rect.y, rect.width, rect.height)
+
+    // нужно явно указывать, что вы переопределяете метод
+    override fun move(dx: Int, dy: Int) {
+        x += dx; y += dy
+    }
+
+    // для каждого класса area() определяется по-своему
+    override fun area(): Float {
+        return (width*height).toFloat() // требуется явное приведение к вещественному числу
+    }
+
+    override fun resize(zoom: Int) {
+        width *= zoom
+        height *= zoom
+    }
+
+    override fun rotate(direction: RotateDirection, centerX: Int, centerY: Int) {
+        var tmpX = x - centerX
+        var tmpY = y - centerY
+        if (direction == RotateDirection.CounterClockwise){
+            val buf = -tmpY
+            tmpY = tmpX
+            tmpX = buf
+        }else{
+            val buf = tmpY
+            tmpY = - tmpX
+            tmpX = buf
+        }
+
+        x = tmpX + centerX;
+        y = tmpY + centerY;
+    }
+}

+ 28 - 0
src/Square.kt

@@ -0,0 +1,28 @@
+// TODO: дополнить определение класса размерами и позицией
+class Square(var x: Float, var y: Float, var width: Float, var height: Float): Figure(0), Transforming  {
+    override fun area(): Float {
+        return width * height
+    }
+
+    override fun resize(zoom: Int) {
+        width*=zoom
+        height*=zoom
+    }
+
+    override fun rotate(direction: RotateDirection, centerX: Int, centerY: Int) {
+        var tmpX = x - centerX
+        var tmpY = y - centerY
+        if (direction == RotateDirection.CounterClockwise){
+            val buf = -tmpY
+            tmpY = tmpX
+            tmpX = buf
+        }else{
+            val buf = tmpY
+            tmpY = - tmpX
+            tmpX = buf
+        }
+
+        x = tmpX + centerX;
+        y = tmpY + centerY;
+    }
+}

+ 12 - 0
src/Transforming.kt

@@ -0,0 +1,12 @@
+interface Transforming {
+    fun resize(zoom: Int)
+    // TODO: величивает фигуру, не перемещая, с сохранением пропорций
+
+    fun rotate(direction: RotateDirection, centerX: Int, centerY: Int)
+    // TODO: поворот фигуры вокруг точки (centerX, centerY) на 90 градусов
+}
+
+enum class RotateDirection {
+    // направление вращения фигуры на 90 градусов
+    Clockwise, CounterClockwise
+}