【问题标题】:Interfacing with super and subclass constructors与超类和子类构造函数的接口
【发布时间】:2012-02-17 10:28:45
【问题描述】:

我在 matlab 文档和以前关于使用 matlab 继承和类构造函数创建接口的问题中找不到帮助。为了使它整洁,在一个包中。

我可以将其压缩如下:

一个包+MyPkg 有一个超类Super 和一些子类Sub1 Sub2...我的大部分属性和方法都在Super 中定义,所以Sub1Sub2 真的只存在于使用它们的构造函数用于简单的例程或一些从 Super 重载的方法。

那么我该如何编写 classdef 和构造函数来支持可以使用以下调用的接口:

a = MyPkg.Super(args).Sub1(args)
b = MyPkg.Super(args).Sub1(args).Sub1Method

在这种情况下,为了可读性和组织性,我想将与 Super 相关的参数与与 Sub1 相关的参数分开。

欢迎提问。

编辑:

在考虑了下面接受的答案并浏览了一些之后,我得出的结论是,上面显示的界面并不真正符合 OO 的精神,对于我的数据分析应用程序来说,更合适的处理方法将包括句柄具有填充对象或对象属性元胞数组的构造函数的类。因为该类是一个句柄类,所以可以使用其上的方法来生成所需的方法。即以下

% in +MyPkg\

classdef Super < handle
    properties
        outputArray
    end
    methods

    function self = Super(args)
        self.outputArray=load_values(args);
    end

    function out = do_analysis(self,params)
        % do some analysis
    end

    end
end

然后使用这个:

data1 = MyPkg.Super(args)
% Populate the outputArray
analysis1 = data1.do_analysis(params)

等等,

希望能帮助其他人处理这些问题

【问题讨论】:

    标签: matlab inheritance interface constructor superclass


    【解决方案1】:

    关于您的问题,如果您使用继承,则不能。只有直接的超类构造函数才能从子类中调用,并且只有从子类中才能调用超类构造函数。 Ref.

    这样暴露超类确实破坏了继承的基础。如果您需要这种访问权限,也许您应该考虑另一种模型,也许是组合(“has a”而不是“is a”)?

    【讨论】:

    • 感谢您的回复,您能否进一步解释一下您最后一句话的意思?
    • 当然。组合是让一个对象“包含”另一个对象。 Class1 保存在 Class2 的属性中,Class2 使用 Class1 作为“黑匣子”。这通常用于“装饰”一个类,即在它上面放置一个不同的接口。这里有一个很好的讨论:stackoverflow.com/questions/49002/… 和这里:lostechies.com/chadmyers/2010/02/13/…
    • 我经常使用的一个终极决策者是问自己是否需要在运行时用一个类替换另一个类。来自 GUI 的一个很好的例子:一个简单的 GUI 可能有一个 Window 父类型和两个子类型:ModalNonModal 对话框。可以想象,为了在屏幕上绘图,它必须保留Windows 的列表,并且不在乎它们是什么类型。如果您使用继承来共享代码和功能,您可能应该更喜欢组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多