Go lang – Polymorphism for interface; array of types which implement interface

huangapple go评论110阅读模式
英文:

Go lang - Polymorphism for interface; array of types which implement interface

问题

我来自Java背景,对Go的面向对象编程(OOP)方法感到有些迷茫。我正在尝试编写一个日志记录函数,基本上可以接受一个数组,该数组可以是一种类型或另一种类型。为了澄清:数组中不会混合类型,它们将是全部为Type1或Type2的数组。

我为这两种类型创建了一个接口供它们实现,但是我的IDE表示不能将类型用作接口。在这里,有什么更好、更符合Go风格的方法吗?

  1. type Loggable interface {
  2. GetFirstName() string
  3. GetLastName() string
  4. }
  5. type Person1 struct {
  6. FirstName string
  7. LastName string
  8. }
  9. func (t Person1) GetFirstName() string {
  10. return t.FirstName
  11. }
  12. func (t Person1) GetLastName() string {
  13. return t.LastName
  14. }
  15. type Person2 struct {
  16. FirstName2 string
  17. LastName2 string
  18. }
  19. func (t Person2) GetFirstName() string {
  20. return t.FirstName2
  21. }
  22. func (t Person2) GetLastName() string {
  23. return t.LastName2
  24. }
  25. func performLogging(logger LoggingPackage.Logger, loggingList []Loggable){
  26. for _, person := range loggingList {
  27. logger.Logf("Person is %s %s", person.GetFirstName(), person.GetLastName())
  28. }
  29. }
  30. func relevantFunction() {
  31. personList := handler.PersonRequest() // 返回一个全部为Person1或全部为Person2的数组
  32. performLogging(logger, personList) // 无法将[]Person1或[]Person2用作[]Loggable
  33. }
英文:

I'm coming from a Java background, so I'm pretty lost by Go's approach to OOP. I'm trying to write a logging function that, fundamentally, can accept an array of either one type or another. To clarify: the arrays will not mix type, they will be an array of all either Type1 or Type 2.

I created an interface for both these types to implement, but my IDE said it can't use the type as the interface. What's the better, more Go-like approach here?

  1. type Loggable interface {
  2. GetFirstName() string
  3. GetLastName() string
  4. }
  5. type Person1 struct {
  6. FirstName string
  7. LastName string
  8. }
  9. func (t Person1) GetFirstName() string {
  10. return t.FirstName
  11. }
  12. func (t Person1) GetLastName() string {
  13. return t.LastName
  14. }
  15. type Person2 struct {
  16. FirstName2 string
  17. LastName2 string
  18. }
  19. func (t Person2) GetFirstName() string {
  20. return t.FirstName2
  21. }
  22. func (t Person2) GetLastName() string {
  23. return t.LastName2
  24. }
  25. func performLogging(logger LoggingPackage.Logger, loggingList []Loggable){
  26. for _, person := range loggingList {
  27. logger.Logf("Person is %s %s", person.GetFirstName(), person.GetLastName())
  28. }
  29. }
  30. func relevantFunction() {
  31. personList := handler.PersonRequest() // returns an array of all either Person1, or all Person2
  32. performLogging(logger, personList) // can't use []Person1 or []Person2 as []Loggable
  33. }```
  34. </details>
  35. # 答案1
  36. **得分**: 2
  37. 我发现在这些情况下,将与问题无关的所有代码删除会有所帮助。这个例子按预期工作:
  38. ~~~
  39. package main
  40. import "fmt"
  41. type Loggable interface {
  42. GetFirstName() string
  43. }
  44. type Person1 struct { FirstName string }
  45. func (t Person1) GetFirstName() string { return t.FirstName }
  46. type Person2 struct { FirstName2 string }
  47. func (t Person2) GetFirstName() string { return t.FirstName2 }
  48. func performLogging(loggingList []Loggable){
  49. for _, person := range loggingList {
  50. fmt.Println(person.GetFirstName())
  51. }
  52. }
  53. func main() {
  54. people := []Loggable{
  55. Person1{"Angela"}, Person2{"Tyrell"},
  56. }
  57. performLogging(people)
  58. }
  59. ~~~
  60. <details>
  61. <summary>英文:</summary>
  62. I find it helps in these cases to rip out all code that is not central to the
  63. problem. This example works as expected:
  64. ~~~
  65. package main
  66. import &quot;fmt&quot;
  67. type Loggable interface {
  68. GetFirstName() string
  69. }
  70. type Person1 struct { FirstName string }
  71. func (t Person1) GetFirstName() string { return t.FirstName }
  72. type Person2 struct { FirstName2 string }
  73. func (t Person2) GetFirstName() string { return t.FirstName2 }
  74. func performLogging(loggingList []Loggable){
  75. for _, person := range loggingList {
  76. fmt.Println(person.GetFirstName())
  77. }
  78. }
  79. func main() {
  80. people := []Loggable{
  81. Person1{&quot;Angela&quot;}, Person2{&quot;Tyrell&quot;},
  82. }
  83. performLogging(people)
  84. }
  85. ~~~
  86. </details>

huangapple
  • 本文由 发表于 2021年10月23日 06:50:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/69683808.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定