Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OOP:从不可变对象继承

OOP:从不可变对象继承
EN

Stack Overflow用户
提问于 2021-05-02 01:52:23
回答 1查看 110关注 0票数 1

背景

假设我有一组相互关联的字段,因此我创建了一个类来收集它们。让我们把这个类称为Base。还有一些方法,这些方法在所有派生类中都是通用的。另外,让我们假设我们希望Base及其所有派生类是不可变的。

在不同的上下文中,这些字段支持额外的操作,因此我有不同的派生类,它们继承字段并根据它们的上下文提供额外的方法。让我们把这些叫做Derived1Derived2等等。

在某些情况下,程序需要派生类的实例,但是字段的状态必须满足某些条件。因此,我做了一个类RestrictedDerived1,在调用它的基本构造函数之前,它确保在构造函数中满足条件(或者更改参数以符合它的要求),或者抛出一个错误。

此外,在某些情况下,我甚至需要满足更多的条件,所以我有了SuperRestrictedDerived1。(附带注意:如果满足了某些条件,这个类可以更有效地计算某些事情,因此它覆盖了Derived1的一些方法。)

问题

到目前一切尚好。问题是,所有这些类的大多数方法都涉及在这个层次结构中创建一个类的另一个实例(不总是与调用方法的实例相同,但通常是相同的实例),而是进行了一些修改,这些修改可能涉及到一些复杂的计算(即不只是改变一个字段)。例如,Derived1的一种方法可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
public Derived1 foo(Base b) {
    TypeA fieldA = // calculations using this and b
    TypeB fieldB = // more calculations
    // ... calculate all fields in this way
    return new Derived1(fieldA, fieldB, /* ... */);
}

但是,层次结构RestrictedDerived1需要这个相同的函数来返回自身的一个实例(如果不能实例化它显然会抛出一个错误),所以我需要像这样覆盖它:

代码语言:javascript
运行
AI代码解释
复制
@Override
public ResrictedDerived1 foo(Base b) {
    return new RestrictedDerived1(super.foo(b));
}

这需要一个副本构造函数,并不必要地分配一个将立即销毁的中间对象。

可能解决办法

我想到的另一种解决方案是将一个函数传递给这些方法中的每一个,这些方法构造了某种类型的Base,然后函数看起来如下所示:

代码语言:javascript
运行
AI代码解释
复制
// In Derived1
public Derived1 foo(Base b, BaseCreator creator) {
    TypeA fieldA = // calculations using this and b
    TypeB fieldB = // more calculations
    // ... calculate all fields in this way
    return creator.create(fieldA, fieldB, /* ... */);
}

public Derived1 foo(Base b) {
    return foo(b, Derived1::create);
}

public static Derived1 create(TypeA fieldA, TypeB fieldB, /* ... */) {
    return new Derived1(fieldA, fieldB, /* ... */);
}

// In RestrictedDerived1
@Override
public ResrictedDerived1 foo(Base b) {
    return (RestrictedDerived1) foo(b, RestrictedDerived1::create);
}

public static RestrictedDerived1 create(TypeA fieldA, TypeB fieldB, /* ... */) {
    return new RestrictedDerived1(fieldA, fieldB, /* ... */);
}

我的问题

这是可行的,但我觉得“笨重”。我的问题是,是否有一些设计模式或概念,或替代设计,以方便我的情况?

我试过使用泛型,但很快就变得凌乱不堪,而且不能很好地应用于不止一个级别的继承。

顺便说一下,它们所引用的实际类是3D点和向量。我有一个名为Triple的基,它包含x、y和z(以及一些函数,这些函数接受lambda并将它们应用于每个坐标,并构造一个新的三元组并得到结果)。然后,我有一个带点相关函数的派生类Point,还有一个带有函数的派生类Vector。然后我有了NonZeroVector (扩展Vector),它不是零向量(因为需要向量的其他对象有时需要保证它不是零向量,而且我不想到处检查)。此外,我还有NormalizedVector (扩展NonZeroVector),它保证长度为1,并在构建时将自己规范化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-02 11:10:11

MyType

可以使用MyType、this类型或self类型的概念来解决这一问题。基本思想是MyType是运行时派生最多的类型。您可以将它看作是this的动态类型,但是静态地(在“编译时”)引用。

不幸的是,并不是很多主流编程语言都有MyTypes,但例如TypeScript有,而且我被告知拉库也有。

在TypeScript中,您可以通过将foo的返回类型设置为MyType (在TypeScript中拼写为this )来解决问题。看起来会是这样的:

代码语言:javascript
运行
AI代码解释
复制
class Base {
    constructor(public readonly fieldA: number, public readonly fieldB: string) {}

    foo(b: Base): this {
        return new this.constructor(this.fieldA + b.fieldA, this.fieldB + b.fieldB);
    }
}

class Derived1 extends Base {
    constructor(fieldA: number, fieldB: string, protected readonly repeat: number) {
        super(fieldA * repeat, fieldB.repeat(repeat));
    }

    override foo(b: Base): this {
        return new this.constructor(
            this.fieldA + b.fieldA, this.fieldB + b.fieldB, this.repeat
        );
    }
}

class RestrictedDerived1 extends Derived1 {
    constructor(fieldA: number, fieldB: string, repeat: number) {
        super(fieldA * repeat, fieldB.repeat(repeat), repeat);
        if (repeat >= 3) { 
            throw new RangeError(`repeat must be less than 3 but is ${repeat}`)
        }
    }
}

const a = new RestrictedDerived1(23, 'Hello', 2);
const b = new Base(42, ' World');

const restrictedDerived = a.foo(b); // Inferred type is RestrictedDerived1

微b0rken游乐场链接

隐工厂

在具有类型类或隐式(如Scala)的语言中,您可以使用隐式Factory对象解决问题。这类似于您对创建者的第二个示例,但不需要在任何地方显式地传递创建者。相反,语言会含蓄地召唤他们。

实际上,您的需求非常类似于Scala集合框架的核心需求之一,即您希望像mapfilterreduce这样的操作只实现一次,但仍然保留集合的类型。

大多数其他集合框架只能实现其中的一个目标:例如,Java、C#和Ruby,每个操作只有一个实现,但它们总是返回相同的、最通用的类型(Stream在Java中,IEnumerable在C#中,Array在Ruby中)。Smalltalk的集合框架保留了类型,但对每个操作都有重复的实现。一个非复制的、类型保持的集合框架是抽象设计人员/语言设计人员的圣杯之一。(这么多介绍面向对象的新方法的论文使用Smalltalk的重构作为它们的工作示例,这绝非巧合。)

F-有界多态性

如果没有可用的MyType或隐式构建器,则可以使用F-有界多态性

典型的例子是如何设计Java的clone方法:

代码语言:javascript
运行
AI代码解释
复制
interface Cloneable<T extends Cloneable<T>> {
    public T clone();
}

class Foo implements Cloneable<Foo> {
    @Override
    public Foo clone() {
        return new Foo();
    }
}

JDoodle实例

然而,对于深嵌套的继承层次结构来说,这很快就变得单调乏味了。我试着在Scala,但我放弃了中建模。

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

https://stackoverflow.com/questions/67354981

复制
相关文章
Xcode 8新功能介绍
概述 Xcode 8正式版在9月13日已经推送给开发者下载,下载之后就出现了很多编译错误,之前的插件也不能用了,但是发现Xcode8把好多不错的插件功能整合到自身了,感觉这点也挺不错。 结合自己遇
xiangzhihong
2018/02/05
1.7K0
Xcode 8新功能介绍
cleanmymac X有哪些新功能?有必要下载安装吗
CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器,只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。CleanMyMac为您喜爱的东西腾出空间。它不仅有着赏心悦目的UI交互页面,更有着强大的“超能力”。无论是清理、优化、软件管理它都能手到擒来。它的操作也十分简单。无论是谁从都可以一次上手。
用户7442547
2023/01/25
8200
YARN的机架感知功能
最近几天做Hadoop机架感知功能时,在网上可以找到很多关于HDFS机架感知的资料,但是对于YARN机架感知的介绍却很少。这篇文章最主要就是说明机架感知功能对于YARN来说起到的作用,若有理解的偏差请指正。谢谢。
醉独醒
2022/05/27
1.2K1
视频智能审核系统的功能 智能审核系统靠谱吗
在这个技术十分发达的时代里,智能的技术可以融入在各个场景当中。尤其是视频智能审核系统,最常应用的是在各个直播平台当中。直播行业是非常流行的,很多平台都开通了直播的功能,但是为了平台的直播内容是绿色且合法的,平台就需要一个审核系统时刻检查各个直播间以及发布视频的内容。
用户8715145
2021/12/31
3.5K0
TensorFlow Hub 更新了,有你期待的功能吗?
自Google推出 TensorFlow Hub 已有一年半了,TensorFlow Hub 是一个开源代码库,可以使用 Google 和 DeepMind 发布的预训练模型。自推出以来,Google发布了数百个模型,有些是通用模型,并可针对特定任务进行微调,而一些模型则更为专业,即使在数据较少或计算能力较弱的情况下,也可以帮助您获得更快、更智能的 ML 应用。
CV君
2020/02/21
1.2K0
XCode新增数据转换功能(导数据)
用法: DAL.AddConnStr("xxgk", "Data Source=192.168.1.21;Initial Catalog=信息公开;user id=sa;password=Pass@word", null, "mssql"); var dal = DAL.Create("xxgk"); DAL.AddConnStr("xxgk2", "Data Source=XXGK.db;Version=3;", null, "sqlite"); File.Delete("XXGK.db"); /
大石头
2018/01/15
7650
Kubenetes NUMA拓扑感知功能介绍
最近的工作内容中涉及到了 NUMA 感知相关的功能,之前没有特意去看过 kubelet 相关部分的实现,也是趁此机会把落下的补补。在看代码的过程中,NUMA 感知部分的逻辑尤其涉及到一些位操作的部分,看的让人头疼,于是从网上搜了搜有关原理的介绍,恰好在官网找到一篇 blog,看完之后再去看代码就会豁然开朗。此篇是对原文的翻译,想阅读原文的可以直接到这里。
李鹤
2023/03/28
1.2K0
Kubenetes NUMA拓扑感知功能介绍
思维的边界,认知智能,从感知智能迈向认知智能
前言:我们正处在认知智能的起步的阶段,还有很多未知的因素,也不知道未来往哪走,但是有一条,无非是要么从知识,要么图谱、要么融合,但是可用肯定前景是无限的。这里有很多的机会,把我们的认知智能,搜索、问答问题、推理这些东西用在工业互联网的很多场景里面,认知智能技术,搜索、回答问题、推理的这些数据用在工业借的很多场景里,认知智能技术蕴藏着巨大的前景。
小马哥学JAVA
2022/12/15
9651
从态势感知到人工智能
在某安全大会上,公司A、B、C三家公司的员工碰到一起聊技术,碰巧3人都在做“态势感知系统”,但是聊着聊着发现:
泉哥
2019/07/18
1.5K0
从态势感知到人工智能
智能汽车车身感知系统详解
本文主要针对车身感知定位系统进行介绍,车身感知主要是感知车辆位置、行驶速度、姿态方位等信息,下文分别介了绍惯性导航、卫星导航系统和高精度地图三种主要的定位技术的发展情况,最后对多融合的车身感知定位系统及发展趋势进行介绍。
一点人工一点智能
2023/03/08
1.2K0
智能汽车车身感知系统详解
Acrobat DC Mac 2023 新版发布,有你期待的功能吗?
Acrobat DC 2023是一款功能强大的PDF文档处理软件,Acrobat DC Mac 2023现已发布,下面我们就来全面了解 一下Acrobat DC Mac 2023 有哪些新功能。
快乐的小丸子
2023/03/19
1K0
人工智能和自动化有区别吗? | 拔刺
自动化这个概念,是由福特汽车公司的机械工程师哈德在1946年的时候提出。理论上自动化是指机械设备系统或整个生产管理过程,在尽可能少用人的情况下,按照既定要求自动工作,实现预期的目标。
镁客网
2018/08/16
1.7K0
人工智能和自动化有区别吗? | 拔刺
Xcode 11 Asset新增自定义color功能
Color可视化定义一直是我期待的内容,以前都是一个文件管理颜色。Xcode 11.2 Asset资源管理新增了一些资源管理,比如这个Color管理。 新建自定义Color ---- 和新增图片一
星宇大前端
2020/01/13
9540
Xcode 11 Asset新增自定义color功能
通往人工智能的感知运动之路
可以说智力始于大约5.5亿年前的寒武纪,当时有了第一只可以移动的多细胞生物。移动给它带来了优势,因为它可以在不同的地方找到食物。但如果你想在不同的地方移动和寻找食物,你需要感知,你需要知道去哪里,这意味着你需要有某种视觉系统或感知系统。就像Gibson所说的:“We see in order to move and we move in order to see.”
用户1324186
2023/09/09
2010
通往人工智能的感知运动之路
数字时钟校时功能_公务员考试考场有钟表吗
医院、学校网络时间同步显示系统是由高精度GPS(北斗)网络母钟、高品质,高稳定性系统网络子钟、智能化控制设备及其它配套设备组成的计时和时钟显示系统,其作用是为保证校园或医院网络提供标准统一的时间服务.
全栈程序员站长
2022/09/20
5940
感知人工智能操作系统
AI即人工智能的又一波浪潮来了。机器学习,深度学习,神经网络,语音识别,图像识别...... 常常充斥我们的耳目。不论是AI赋能产业,还是AI改变生活,有的人停留于想象,有的人却在付诸实践。
半吊子全栈工匠
2019/03/11
1.6K0
感知人工智能操作系统
想学人工智能,有必要出国读本科或硕士吗?
笔者硕士毕业于北京大学计算机专业,期间有幸申请到了澳洲国立大学(Australian National University,简称ANU)的交换机会,对国内外人工智能教育均有所体验。毕业后,有四年一线大数据和人工智能从业经验,对AI行业形成了一些个人理解。
PP鲁
2019/12/26
2.5K0
从感知智能跨越到认知智能,NLP领域要做哪些创新?
欢迎大家关注「澜舟科技」公众号,加入孟子开源社区,一起探索 NLP 领域的前沿技术!
澜舟科技
2022/06/14
7830
从感知智能跨越到认知智能,NLP领域要做哪些创新?
《模式识别与智能计算》感知机模型
感知机模型 按照统计学三要素来写的话: 模型:符号函数 策略:损失函数;误点到超平面的距离之和 算法:利用梯度下降算法进行求解 感知机原理: 感知机模型用来线性判别数据集,什么意思呢就是用一超平面来隔断两个不同的类别,超平面在二维的数据集中就是一条直线,在三维的数据集中就是一个平面,假设有n维的数据,那么划分的超平面为(n-1)维度。如下图二维和三维的情况,蓝色部分为超平面:
Max超
2020/02/13
6130
Apple 系统正式版要发布了,有你期待的功能吗?
Apple操作系统每年例行升级时间到,每年都说的那么牛B,不管是IOS还是Mac os功能已经曝光的差不多了,你需要的功能有出现吗? 每年对系统的升级,其实还是很期待的,但是发现,Apple的系统现在越来越关注一些高科技,很多接地气的使用功能一直没有,还是让人很失望的。 说一说新版系统对我的吸引力吧。 IOS IOS11的新功能:https://www.apple.com/cn/ios/ios-11/ 相机扫码 这个应该是最喜欢的功能了. 我再也不用通过微信扫码,然后safri打开跳转了。 文件管理App
itmifen
2018/04/16
8830

相似问题

Apache Zeppelin有智能感知功能吗?

110

智能感知在XCode中工作吗?

21

附加信息的XCode智能感知

22

像VSCode一样,WebStorm也有智能感知功能吗?

10

Xcode有代码导航功能吗?

52
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文