Erzielen Sie eine Mixin-ähnliche Implementierungsvererbung: Ruby-Modul, Java-Schnittstelle, PHP-Eigenschaft

Überblick

Was ist Mixin (Mix-In)?

Mit dieser Funktion können Sie eine bestimmte implementierte Funktion übernehmen und verwenden, z. B. die Klassenvererbungsfunktion der Programmiersprache. Einige Programmiersprachen implementieren Mixin ohne Verwendung allgemeiner Klassenvererbungsfunktionen.

Mixin - Wikipedia

mixin ist eine Klasse in einer objektorientierten Programmiersprache, die Funktionen bereitstellt, indem sie von Unterklassen geerbt wird, und nicht für den unabhängigen Betrieb vorgesehen ist.

Trait ist ein Konzept ähnlich wie Mixin.

Trate \ -Wikipedia

Ein Merkmal ist ein Konzept in der Computerprogrammierung, eine Sammlung von Methoden, die als einfaches konzeptionelles Modell für die strukturell objektorientierte Programmierung verwendet werden.

Merkmale ähneln Mix-Ins, aber mit Mix-Ins können Sie Methoden nur durch Vererbungsoperationen synthetisieren, während Sie mit Merkmalen Methoden auf mehr Arten synthetisieren können, einschließlich symmetrischer Hinzufügungen, Methodenausschlüssen und Aliasing. Das Merkmal unterscheidet sich auch von der Schnittstelle darin, dass es die Implementierung sowie die Typspezifikation der Methode zum Zeitpunkt der Synthese angibt.

Erreiche Mixin mit dem Ruby-Modul

In Ruby kann Mixin mithilfe eines Moduls realisiert werden.

Einführung \ (Ruby 2 \ .6 \ .0 )

Ruby hat absichtlich keine Mehrfachvererbung, da Mehrfachvererbung eine Quelle der Komplexität darstellt, aber Module können verwendet werden, um Implementierungen über die Klassenhierarchie hinweg gemeinsam zu nutzen. Diese Funktion wird als "Mix-In" bezeichnet.

Beispielcode

module Printer

  #Inhalt ausgeben
  def print
    #Auf der Klassenseite@Lesen und geben Sie die Inhaltsvariable aus
    puts "#{@content}"
  end
end

class Message

  #Druckermodul mischen-im
  include Printer

  def initialize(content)
    @content = content
  end
end

#Nachrichtenklasse mischt Druckermodul-Weil es in ist
#Sie können die Druckmethode verwenden
m = Message.new('Hello, world')
m.print

Betriebsprüfungsumgebung und Ausführungsergebnis

$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]

$ ruby mixin.rb 
Hello, world

Erreiche Mixin mit PHP-Eigenschaft

In PHP können Merkmale verwendet werden, um Mixin zu implementieren.

PHP: Trate \ -Manual

PHP 5.4.0 und höher führten einen Mechanismus namens "Merkmale" zur Wiederverwendung von Code ein. Trate ist einer der Mechanismen zur Wiederverwendung von Code in einer einzigen Vererbungssprache wie PHP. Die Merkmale sollen die Einschränkungen der Einzelvererbung verringern und die Wiederverwendung mehrerer Methoden in unabhängigen Klassen in verschiedenen Klassenhierarchien ermöglichen. Die kombinierte Merkmal- und Klassensyntax reduziert die Komplexität und vermeidet außerdem häufige Probleme im Zusammenhang mit Mehrfachvererbung und Mixin. Ein Merkmal ähnelt einer Klasse, aber ein Merkmal dient nur zum Gruppieren einiger Merkmale. Sie können keine Instanz des Merkmals selbst erstellen. Durch Hinzufügen von Funktionen zur altmodischen Vererbung können Sie das Verhalten horizontal konfigurieren. Mit anderen Worten, Sie können Klassenmitgliedern hinzufügen, ohne zu erben.

Beispielcode

<?php

trait Printer {

  /**
   *Gibt den Inhalt zurück.
   * @Rückgabezeichenfolge Inhaltszeichenfolge
   */
  abstract protected function getContent();

  /**
   *Inhalt ausgeben.
   */
  public function print() {
    echo $this->getContent(), "\n";
  }
}

class Message {

  #Druckereigenschaft mischen-im
  use Printer;

  private $content;

  /**
   *Konstrukteur.
   * @param string $Inhalt Inhaltszeichenfolge
   */
  public function __construct(string $content) {
    $this->content = $content;
  }

  /**
   *Gibt den Inhalt zurück.
   * @Rückgabezeichenfolge Inhaltszeichenfolge
   */
  protected function getContent() {
    return $this->content;
  }
}

#Die Nachrichtenklasse mischt die Druckereigenschaften-Weil es in ist
#Sie können die Druckmethode verwenden
$m = new Message('Hello, world');
$m->print();

Betriebsprüfungsumgebung und Ausführungsergebnis

$ php --version
PHP 7.3.7 (cli) (built: Jul  5 2019 12:44:05) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies

$ php mixin.php 
Hello, world

Erreichen Sie Mixin mit Java-Schnittstelle

In Java kann Mixin mithilfe der Standardschnittstellenmethode realisiert werden.

Weiterentwicklung der Java-Schnittstelle (Java Magazine Vol.37 JANUAR / FEBRUAR 2018)

Die Standardmethode ist der Methodenkörper, dh die Methode der Schnittstelle mit der Standardimplementierung. Die Standardmethode wird definiert, indem der Methodensignatur der Standardmodifikator vorangestellt wird, und enthält den gesamten Hauptteil der Methode.

Beispielcode

interface Printer {

  /**
   *Gibt den Inhalt zurück.
   * @Inhaltszeichenfolge zurückgeben
   */
  String getContent();

  /**
   *Inhalt ausgeben.
   */
  default void print() {
    //Aus der auf der Klassenseite implementierten getContent-Methode
    //Holen Sie sich Inhalt und Ausgabe
    System.out.println(getContent());
  }
}
//Druckerschnittstelle mischen-im
public class Message implements Printer {

  private String content;

  /**
   *Konstrukteur.
   * @param content content string
   */
  public Message(String content) {
    this.content = content;
  }

  /**
   *Gibt den Inhalt zurück.
   * @Inhaltszeichenfolge zurückgeben
   */
  @Override
  public String getContent() {
    return content;
  }

  public static void main(String[] args) {
    //Nachrichtenklasse mischt Druckerschnittstelle-Weil es in ist
    //Sie können die Druckmethode verwenden
    Message m = new Message("Hello, world");
    m.print();
  }
}

Betriebsprüfungsumgebung und Ausführungsergebnis

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

$ javac Printer.java Message.java 

$ java Message
Hello, world

Recommended Posts

Erzielen Sie eine Mixin-ähnliche Implementierungsvererbung: Ruby-Modul, Java-Schnittstelle, PHP-Eigenschaft
[ev3 × Java] Schnittstelle, Implementierung und Vererbung (Ereignisverarbeitung)
Zusammenfassung der erweiterten Vererbung, Schnittstelle -java
Vererbung der JAVA-Lernverlaufsschnittstelle
Schriftliche Unterschiede in Ruby, PHP, Java, JS
Erreichen Sie eine OpenSSL-kompatible Verschlüsselung mit Java / PHP