2014-06-15 21 views
9

Tôi mới tham gia và tôi tự hỏi làm thế nào tôi có thể triển khai một cấu trúc tương tự như các lớp trừu tượng & các phương thức trong Java. Trong Java, tôi muốn làm như sau:Tương đương với các lớp/phương thức trừu tượng (Java) trong Google Go

abstract class A{ 

static method1(){ 
    ... 
    method2(); 
    ... 
} 

abstract method2(); 

} 

class B extends A{ 

method2(){ 
    ... 
} 

} 

class C extends A{ 

method2(){ 
    ... 
} 

} 

tôi biết về giao diện và cấu trúc. Tôi có thể xây dựng một giao diện và sau đó một cấu trúc để thực hiện phương thức1. Nhưng còn phương pháp 2 thì sao? Tôi biết rằng tôi có thể nhúng một giao diện vào một giao diện khác và cũng là một cấu trúc như một trường của cấu trúc khác. Nhưng tôi không thấy một cách để thực hiện cấu trúc của tôi với những phương pháp đó.

Giải pháp duy nhất tôi thấy là triển khai method1 cả ở lớp B và lớp C. Không có cách nào khác?

Lưu ý: tất nhiên trong trường hợp của tôi, đó không chỉ là một phương pháp. Tôi cũng có một hệ thống phân cấp các lớp trừu tượng và không thực sự muốn di chuyển mọi thứ xuống 'lớp con'.

Các ví dụ tôi đã tìm thấy trên internet chủ yếu chỉ với một phương thức cho mỗi giao diện. Nó sẽ là tuyệt vời nếu một trong các bạn có thể cho tôi một gợi ý ở đây! Cảm ơn.

Trả lời

6

Từ Go không có static phương pháp theo nghĩa OOP, bạn thường nhìn thấy những loại phương pháp đang được triển khai như các chức năng mức gói:

package mypackage 

func() Method1() { ... } // Below I will call it Function instead 

chức năng mức gói này sau đó sẽ có một giao diện như một cuộc tranh cãi. Mã của bạn trong trường hợp đó nhìn một cái gì đó như thế này:

package main 

import "fmt" 

type Methoder interface { 
    Method() 
} 

func Function(m Methoder) { 
    m.Method() 
} 

type StructB struct{} 

func (s *StructB) Method() { fmt.Println("StructB") } 

type StructC struct{} // You can do some "inheritance" by embedding a base struct 

func (s *StructC) Method() { fmt.Println("StructC") } 

func main() {  
    b := &StructB{} 
    Function(b)  
} 

Output:

StructB 
+0

Giống như câu trả lời này và muốn thêm vào, nếu bạn cần có giao diện cấu trúc, giống như lớp trừu tượng, bạn có thể sử dụng nguyên tắc giống như @ANisus đã viết, nhưng thêm các phương thức getters. Vì vậy, bạn có thể gọi các tham số cấu trúc như '' 'Model.getName''' trong đó cấu trúc chính xác' '' Model''' giải quyết một số giao diện mà bạn đã tạo. – Altenrion

9

Bạn có thể có giao diện composite, ví dụ từ io gói:

http://golang.org/src/pkg/io/io.go?s=2987:3047#L57

type Reader interface { 
    Read(p []byte) (n int, err error) 
} 
type Writer interface { 
    Write(p []byte) (n int, err error) 
} 

type ReadWriter interface { 
    Reader 
    Writer 
} 

Là một mặt lưu ý, không nên cố gắng để thực hiện mã java sử dụng đi, cố gắng tìm hiểu những Go Way .

+0

Cảm ơn. Hãy để tôi xem nếu tôi hiểu bạn một cách chính xác. Bạn có nghĩa là tôi nên tạo một giao diện cho phương thức1, một giao diện cho phương thức 2 và một giao diện hỗn hợp. Nhưng nơi nào tôi đặt thực hiện của tôi cho method1 có sử dụng method2 (có lẽ tôi đã không nêu rõ điều này rõ ràng)? Tôi vẫn có mã trùng lặp theo cách này, đúng không? – User42

+0

Tôi không chắc lắm tôi hiểu bạn nhưng nếu 1 struct có thể thỏa mãn nhiều giao diện, hoặc bạn có thể định nghĩa các hàm trên 'interfaceA',' interfaceB' và truyền các cấu trúc của bạn cho chúng thay vì thực thi mã trên cấu trúc . – OneOfOne

0

Ví dụ bạn đang yêu cầu sẽ không biên dịch trong Java trừ khi bạn xóa từ khóa tĩnh từ method1, vì vậy đúng lớp trừu tượng trong Java sẽ như thế này.

public abstract class A { 
    void method1(){ 
    method2();} 
    abstract void method2(); 
} 

Để cung cấp tương đương trong go-lang bạn sẽ phải sử dụng một giao diện theo cách sau: Go Playground

package main 

import (
    "fmt" 
) 

type AI interface { 
    //define all methods that you want to override 
    method2() 
} 

type A struct {//this type is an abstract of AI type since it does not implement method2 
    AI 
} 

func (a * A) method1() { 
    a.method2() 
} 

type B struct {//inherit all from A 
    *A 
} 
func (b *B) method2() { 
    fmt.Print("Hello from B method1\n") 
} 

func NewB() *B{ 
    b := &B{} 
    a := &A{b} 
    b.A = a 
    return b 
} 

type C struct {//inherit all from A 
    *A 
} 

func (c *C) method2() { 
    fmt.Print("Hello from C method1\n") 
} 

func NewC() *C{ 
    c := &C{} 
    a := &A{c} 
    c.A = a 
    return c  
} 

func main() { 

    b := NewB() 
    b.method1() 

    c:= NewC() 
    c.method1() 
} 

Do đây vẫn không thể được dễ dàng như thế nào để dịch/thực hiện lớp trừu tượng java/đa thừa kế để đi lang thang ở đây là bài viết với các chi tiết toàn diện. Abstract Class in golang

Các vấn đề liên quan