Kotlin - Classe e Objeto

Neste capítulo, aprenderemos os fundamentos da Programação Orientada a Objetos (OOP) usando Kotlin. Vamos aprender sobre a classe e seu objeto e como brincar com esse objeto. Por definição de OOP, uma classe é um projeto de uma entidade de tempo de execução e o objeto é seu estado, que inclui seu comportamento e estado. Em Kotlin, a declaração de classe consiste em um cabeçalho de classe e um corpo de classe cercado por chaves, semelhante a Java.

Class myClass { // class Header 

   // class Body
}

Assim como o Java, o Kotlin também permite criar vários objetos de uma classe e você é livre para incluir seus membros e funções de classe. Podemos controlar a visibilidade das variáveis ​​dos membros da classe usando diferentes palavras-chave que aprenderemos no Capítulo 10 - Controle de visibilidade. No exemplo a seguir, criaremos uma classe e seu objeto por meio do qual acessaremos diferentes membros de dados dessa classe.

class myClass {
   // property (data member)
   private var name: String = "Tutorials.point"
   
   // member function
   fun printMe() {
      print("You are at the best Learning website Named-"+name)
   }
}
fun main(args: Array<String>) {
   val obj = myClass() // create obj object of myClass class
   obj.printMe()
}

O trecho de código acima produzirá a seguinte saída no navegador, onde estamos chamando printMe () de myClass usando seu próprio objeto.

You are at the best Learning website Named- Tutorials.point

Classe Aninhada

Por definição, quando uma classe é criada dentro de outra classe, ela é chamada como uma classe aninhada. No Kotlin, a classe aninhada é estática por padrão, portanto, pode ser acessada sem criar nenhum objeto dessa classe. No exemplo a seguir, veremos como Kotlin interpreta nossa classe aninhada.

fun main(args: Array<String>) {
   val demo = Outer.Nested().foo() // calling nested class method
   print(demo)
}
class Outer {
   class Nested {
      fun foo() = "Welcome to The TutorialsPoint.com"
   }
}

O trecho de código acima produzirá a seguinte saída no navegador.

Welcome to The TutorialsPoint.com

Classe Interna

Quando uma classe aninhada é marcada como “interna”, ela será chamada de classe interna. Uma classe interna pode ser acessada pelo membro de dados da classe externa. No exemplo a seguir, iremos acessar o membro de dados da classe externa.

fun main(args: Array<String>) {
   val demo = Outer().Nested().foo() // calling nested class method
   print(demo)
}
class Outer {
   private val welcomeMessage: String = "Welcome to the TutorialsPoint.com"
   inner class Nested {
      fun foo() = welcomeMessage
   }
}

O trecho de código acima produzirá a seguinte saída no navegador, em que chamamos a classe aninhada usando o construtor padrão fornecido pelos compiladores Kotlin no momento da compilação.

Welcome to the TutorialsPoint.com

Classe interna anônima

Classe interna anônima é um conceito muito bom que torna a vida de um programador muito fácil. Sempre que estamos implementando uma interface, o conceito de bloqueio interno anônimo vem à tona. O conceito de criar um objeto de interface usando referência de objeto em tempo de execução é conhecido como classe anônima. No exemplo a seguir, vamos criar uma interface e vamos criar um objeto dessa interface usando o mecanismo da classe Anonymous Inner.

fun main(args: Array<String>) {
   var programmer :Human = object:Human // creating an instance of the interface {
      override fun think() { // overriding the think method
         print("I am an example of Anonymous Inner Class ")
      }
   }
   programmer.think()
}
interface Human {
   fun think()
}

O trecho de código acima produzirá a seguinte saída no navegador.

I am an example of Anonymous Inner Class

Digite aliases

Os aliases de tipo são propriedade do compilador Kotlin. Ele fornece a flexibilidade de criar um novo nome de um tipo existente, mas não cria um novo tipo. Se o nome do tipo for muito longo, você pode facilmente introduzir um nome mais curto e usar o mesmo para uso futuro. Os aliases de tipo são realmente úteis para tipos complexos. Na versão mais recente, Kotlin revogou o suporte para aliases de tipo, no entanto, se você estiver usando uma versão antiga do Kotlin, você pode ter usado como o seguinte -

typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>