【问题标题】:MATLAB constructor / interface-class without object没有对象的MATLAB构造函数/接口类
【发布时间】:2017-05-25 03:31:52
【问题描述】:

在 MATLAB 中有没有一种方法可以构造某种使用接口类或其他东西,它不会输出自己的对象?我有这样的想法:

object1_from_class_main = constructor_class_A()
object2_from_class_main = constructor_class_B()
object3_from_class_main = constructor_class_C()

class_A / class_B / class_C 继承自class_main。这意味着应该存在一个处理所有用户输入的main_class,并且在这个类内部,所有其他子类都被构造/维护。

我不知道这是否有很大的错误,但如果您有任何建议,我将不胜感激。

【问题讨论】:

  • 为什么不直接使用函数来创建类呢?也可以给我们一个真实的例子,说明为什么你想这样做。
  • 嗯,我需要像基类这样的东西,它能够遍历所有对象,存储它们的句柄等。这就是为什么我想使用这个基类/主类作为接口用户。
  • previous answer中提出的方法有什么问题
  • 我觉得如果你只是解释你想要做什么而不是问多个关于 OOP 如何工作的真正不清楚的问题会容易得多。
  • 让不同的对象(chairtable 等)都派生自超类 (furniture) 确实有意义,它处理所有常见任务,例如输入处理。请注意,chair 对象将显示为 class:chair,但它也将属于 class:furniture(即 isa(object, 'furniture') 将返回 true

标签: matlab class oop constructor interface


【解决方案1】:

按照设计,构造函数必须返回构造函数所属类的对象the output should be unassigned。它不能返回 不同 类的对象。来自the documentation

构造函数的唯一输出参数是构造的对象。如果不想分配输出参数,可以在构造函数中清除对象变量。

可以classAclassB 等定义一个返回类Main 的对象的静态方法

classdef ClassA < handle
    methods (Static)
        function mainobj = create_main()
            % Construct Main object and do whatever you need to here
            mainobj = Main();
        end
    end
end

class_of_main = ClassA.create_main();

或者,您可以将 Main 实例设为类的属性

classdef ClassA < handle

    properties
        mainobj
    end

    methods
        function self = ClassA()
            self.mainobj = Main()
        end
    end
end

一个更好的问题是为什么你需要这样做。

更新

根据您的说明,您基本上需要一个控制器来跟踪您创建的所有 Furniture 对象。您可以使用跟踪 Furniture 对象的类来做到这一点

classdef FurnitureController < handle
    properties
        furnitures = furniture.empty()
    end

    methods
        function addFurniture(self, furniture)
            self.furnitures = [self.furnitures, furniture];
        end
    end
end

classdef Furniture < handle
end

classdef Chair < Furniture
end

classdef Desk < Furniture
end

controller = FurnitureController()
controller.addFurniture(Desk())
controller.addFurniture(Chair())

【讨论】:

  • 好吧,我将尝试解释我为什么要这样做:用户应该能够生成不同的对象,例如chair,table,cupboard。但是所有这些对象都属于超类furniture。如果用户使用命令red_chair = chair(),我不希望他生成类chair 的对象,而是生成超类furniture 的对象,它处理其所有子对象的不同功能。
  • @Lemonbonbon 因此,如果用户创建chair,他们可能想要chair 而不是furniture。如果您要求GirlfriendBoyfriend 而我给了您一个通用的Person 对象,您会很不高兴,不是吗?你看过超类吗?
  • @Suever 谁能找到 meeeeee some Person to loveee
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2020-08-25
  • 2010-11-11
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多