首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用VBA模拟Java 8 (Excel)

使用VBA模拟Java 8 (Excel)
EN

Stack Overflow用户
提问于 2019-09-28 21:36:05
回答 1查看 62关注 0票数 0

我想学习有关设计模式的知识,并能够在Excel VBA中应用它们。因此,为了了解模式,我买了一本看起来很有前途的书:“Head First Design Pattern”;它清晰地呈现了材料。然而,代码练习/示例是用Java8编写的。“扩展”),所以我需要弄清楚如何在VBA中实现相同/相似的功能。

我正在跟随这些练习,做我认为与VBA中的Java相似的事情。我在这里问的是“我在正确的轨道上吗?”我知道这是一个很大的问题,也许这个问题太宽泛了,但也可能不是。

“Main”过程有一些不同之处,因为我还没有完全模仿VBA中的Java。我对“Duck”和“Mallard”的实现更感兴趣。

我们非常感谢您的任何建议。

以下是on练习的一部分的Java:

代码语言:javascript
运行
复制
    public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }

    abstract void display();

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("All ducks float, even decoys!");
    }

    public class MallardDuck extends Duck {

    public MallardDuck() {

        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();

    }

    public void display() {
        System.out.println("I'm a real Mallard duck");
    }
}

    public class MiniDuckSimulator {

    public static void main(String[] args) {

        MallardDuck mallard = new MallardDuck();
        FlyBehavior cantFly = () -> System.out.println("I can't fly");
        QuackBehavior squeak = () -> System.out.println("Squeak");
        RubberDuck  rubberDuckie = new RubberDuck(cantFly, squeak);
        DecoyDuck   decoy = new DecoyDuck();

        Duck     model = new ModelDuck();

        mallard.performQuack();
        rubberDuckie.performQuack();
        decoy.performQuack();

        model.performFly(); 
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

下面是我在VBA中所做的工作:

代码语言:javascript
运行
复制
'@Folder("SimUDuck.Objects.HeadFirst")
Option Explicit
Private Type TObject
    FlyBehavior As IFlyBehavior
    QuackBehavior As IQuackBehavior
    DuckModel As IDuckModel
End Type
Private this As TObject

Private Sub Class_Terminate()
    With this
        Set .FlyBehavior = Nothing
        Set .QuackBehavior = Nothing
    End With
End Sub

Public Property Get DuckModel() As IDuckModel
    Set DuckModel = this.DuckModel
End Property
Public Property Set DuckModel(ByVal model As IDuckModel)
    With this
        Set .DuckModel = model
    End With
End Property
Public Property Get FlyBehavior() As IFlyBehavior
    Set FlyBehavior = this.FlyBehavior
End Property
Public Property Set FlyBehavior(ByVal behavior As IFlyBehavior)
    Set this.FlyBehavior = behavior
End Property
Public Property Get QuackBehavior() As IQuackBehavior
    Set QuackBehavior = this.QuackBehavior
End Property
Public Property Set QuackBehavior(ByVal behavior As IQuackBehavior)
    Set this.QuackBehavior = behavior
End Property

Public Sub performFly()
    this.FlyBehavior.Fly
End Sub
Public Sub performQuack()
    this.QuackBehavior.Quack
End Sub

Public Sub Swim()
    'todo
End Sub
Public Sub Display()
    this.DuckModel.Display
End Sub

'@PredeclaredId
'@Folder("SimUDuck.Models.HeadFirst")
Option Explicit
Private Type TModel
    Display As String
End Type
Private this As TModel
Implements IDuckModel
Private Sub IDuckModel_Display()
    Debug.Print this.Display '"I'm A Mallard Duck"
End Sub

Public Function CreateDuck(ByVal duck As DuckObject) As IDuckModel
    With duck
        Set .FlyBehavior = New FlyWithWingsBehavior
        Set .QuackBehavior = New QuackBehavior
    End With
    With New MallardDuckModel
        .Display = "I'm A Mallard Duck"
        Set CreateDuck = .Self
    End With
End Function
Public Property Get Self() As IDuckModel
    Set Self = Me
End Property
Public Property Get Display() As String
    Display = this.Display
End Property
Public Property Let Display(ByVal value As String)
    this.Display = value
End Property

Public Sub MainDuck()
    Dim duck As DuckObject
    Set duck = New DuckObject
    With New MallardDuckModel
        Dim model As IDuckModel
        Set model = .CreateDuck(duck)
    End With
    With duck
        Set .DuckModel = model
        .performFly
        .performQuack
        .Display
        Dim FlyBehavior As IFlyBehavior
        Set FlyBehavior = New FlyRocketPoweredBehavior
        Set .FlyBehavior = FlyBehavior
        Dim QuackBehavior As IQuackBehavior
        Set QuackBehavior = New SqueakBehavior
        Set .QuackBehavior = QuackBehavior
        .performFly
        .performQuack
        .Display
    End With
    Set duck = New DuckObject
    With New ModelDuckModel
        Set model = .CreateDuck(duck)
    End With
    With duck
        Set .DuckModel = model
        .performFly
        .performQuack
        .Display
    End With
End Sub
EN

Stack Overflow用户

发布于 2020-05-25 23:18:05

在搜索Head First Design Pattern练习的翻译时,我偶然发现了这篇文章。我一直使用RubberduckVBA博客文章作为在VBA语言中实现OOP概念和设计模式(特别是工厂)的指南。

https://rubberduckvba.wordpress.com/tag/oop/

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58146824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档