Черты являются структурной конструкцией языка, которая позволяет —
- Композиция поведения.
- Реализация интерфейсов во время выполнения.
- Совместимость со статической проверкой типов / компиляцией
Их можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Черта определяется с помощью ключевого слова trait.
Пример черты приведен ниже —
trait Marks { void DisplayMarks() { println("Display Marks"); } }
Затем можно использовать ключевое слово Implement для реализации черты аналогично интерфейсам.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; println(st.DisplayMarks()); } } trait Marks { void DisplayMarks() { println("Display Marks"); } } class Student implements Marks { int StudentID int Marks1; }
Реализация интерфейсов
Черты могут реализовывать интерфейсы, в этом случае интерфейсы объявляются с использованием ключевого слова Implements.
Пример особенности реализации интерфейса приведен ниже. В следующем примере можно отметить следующие ключевые моменты.
-
Интерфейс Total определяется методом DisplayTotal.
-
Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.
Интерфейс Total определяется методом DisplayTotal.
Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; println(st.DisplayMarks()); println(st.DisplayTotal()); } } interface Total { void DisplayTotal() } trait Marks implements Total { void DisplayMarks() { println("Display Marks"); } void DisplayTotal() { println("Display Total"); } } class Student implements Marks { int StudentID int Marks1; }
Результатом вышеупомянутой программы будет —
Display Marks Display Total
свойства
Черта может определять свойства. Пример черты со свойством приведен ниже.
В следующем примере Marks1 типа integer является свойством.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; println(st.DisplayMarks()); println(st.DisplayTotal()); } interface Total { void DisplayTotal() } trait Marks implements Total { int Marks1; void DisplayMarks() { this.Marks1 = 10; println(this.Marks1); } void DisplayTotal() { println("Display Total"); } } class Student implements Marks { int StudentID } }
Результатом вышеупомянутой программы будет —
10 Display Total
Состав поведения
Черты могут быть использованы для реализации множественного наследования контролируемым образом, избегая проблемы алмазов. В следующем примере кода мы определили две черты — Marks и Total . Наш Студенческий класс реализует обе черты. Так как ученический класс расширяет обе черты, он может получить доступ к обоим методам — DisplayMarks и DisplayTotal .
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; println(st.DisplayMarks()); println(st.DisplayTotal()); } } trait Marks { void DisplayMarks() { println("Marks1"); } } trait Total { void DisplayTotal() { println("Total"); } } class Student implements Marks,Total { int StudentID }
Результатом вышеупомянутой программы будет —
Total Marks1
Расширение черт
Черты могут расширять другую черту, в этом случае вы должны использовать ключевое слово extends . В следующем примере кода мы расширяем черту Total с помощью черты Marks.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; println(st.DisplayMarks()); } } trait Marks { void DisplayMarks() { println("Marks1"); } } trait Total extends Marks { void DisplayMarks() { println("Total"); } } class Student implements Total { int StudentID }
Результатом вышеупомянутой программы будет —