问题标签 [subtyping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database-design - 包括人员和组织在内的数据库设计
我最近在关系数据库设计中发现了子类型/超类型方法,因此提出了这个问题:这是与子类型/超类型设计方法混合的正确设计吗?
在我提到persons
和organisations
作为两种不同的类型之前。我知道拥有andparty
的超类型是一种更好的方法。现在,解决了这个问题,添加and both apply for和 for ,从而将它们连接到 supertype 。people
organisation
adresses
additional_addresses
organisations
persons
parties
此外,我需要记录不同的人群,employees
比如projectcontacts
和suppliercontacts
。这些都是不同类型的persons
, 在party
. 这是加入表格persons
以实现此目标的正确方法吗?suppliers
and 也一样debtors
,链接到organisation
表格,因为supplier
and debtors
are always organisations
。
我相信这是一种很好的设计方式,但我可能会错过主键和外键的一些内容,尤其是在查看SupplierContacts
. 有一个外键partyid
应该引用a person
,也有一个外键supplierid
,但这也引用了自己表中supplierid
的某个。partyid
能够从该表中查询信息不是一项非常艰巨的工作吗?这种设计是否合适?
我主要担心的是,许多表需要引用一个人或一个组织,而不是到处都有两个外键,因为我存储了一个person
OR an的记录,所以始终留下一个 NULL organisation
,现在我只有一个外键:partyid
.
scala - Scala 泛型类型和子类型化
这是我作业中的问题之一,这完全让我感到困惑。该问题询问编译器是否会报告错误。我了解协变和逆变如何与单一类型一起工作。
以上是我的想法,如有错误请指正。
这一行 A 和 B 都是类型参数位置,应该翻转,B 应该是 B >: Dog[U,T,V],但是对于程序的其他部分,我不知道发生了什么。
c# - C#如何避免类型转换为子类?
假设我有一个名为 Shape 的基类。然后是一些子类,例如圆形和方形。
然后让我们在另一个名为 GetShape 的类中创建一个方法:
好吧,我的想法是,我可以传入一个 shapeType,然后返回一个强类型的 Shape 子类。上面的例子是对真实代码的大规模简化,但我认为它明白了这一点。
那么当我调用这个方法时它看起来像
唯一的问题是它甚至不会运行,因为它需要强制转换。
这实际上会起作用:
我对那个演员并不疯狂,我怎样才能避免它并且仍然完成一种让方法返回基类的方法,以便我可以返回任何兼容的子类。
java - 我可以说“如果 A 类是 B 类的子类,那么 A 类必须是 B 类的子类”吗?
subtype
我对和之间的关系有一些了解subclass
,但我不确定它们是否正确。
具体类(不是通用/高阶类)
如果我声明一些具体的类或类型,用 Java 或 Scala 说:
如果 classA
是 class 的子类B
,那么 typeA
必须是 type 的子类型B
?
而且,如果 typeA
是 type 的子类型B
,那么 classA
是 class 的子类B
吗?(假设A
并且B
都是类)
但只有当它是具体的类或类型时它们才是真的
高阶类/类型
但是对于高阶类型,这不是真的,对吧?说:
那么 typeA[String]
是 type 的子类型A[Object]
,但A[String]
不是 的子类A[Object]
,对吧?
scala - 当混合具有冲突抽象覆盖的多个特征时,我如何预测将选择哪个实现?
考虑这个例子:
我对“HELLO, WORLD!”的输出感到惊讶。为什么输出不是“你好,世界!” 还是编译错误?
java - Java 上的通配符和子类型
我刚开始学习 Java 上的通配符和子类型,并尝试测试我学到的东西。
认为:
主要:
我不明白为什么我不能使用下界通配符访问成员 y,而可以使用上限通配符。我错过了什么吗?
rust - 在 Rust 中与生命周期的子类型关系作斗争
我对多次浏览 Rust 文档的标记部分和关于子类型和方差的维基百科文章感到愚蠢,却没有提高我对生命周期子类型关系的理解。
我想我只是习惯了“典型的 OOP 风格”子关系,例如“Cat <: Animal”,意思是“Cat 是 Animal 的子类型”,其中“S 是 T 的子类型”意味着“任何术语 S 都可以安全在预期 T 类型术语的上下文中使用”。到目前为止,一切都很好。
但这如何适用于生命周期?现在在 Rust 中定义的方式显然是 (*)
(#1) 'a <: 'b <=> 生命周期 a 不长于生命周期 b。
你可能会想“当然就是这个意思!” 可能是因为 <: 看起来类似于小于运算符,或者可能是因为“sub”让您想到子集,而较短的寿命肯定是较长寿命的一个子集。但是,如果'a 不长于'b,'a 真的是'b的子类型吗?让我们尝试应用 Wikipedia 对子类型关系的定义:
(#2) 'a <: 'b <=> 生命周期 a 可以安全地用于预期生命周期 b 的上下文中。
我的问题是我无法调和这一点。你如何从#2 到#1?因为对我来说,这似乎是一个矛盾...如果您期望某物至少在 b 内还活着,并且您的某物的生命期 a 比 b 短,那么您显然不能在某物的生命期为 b 的情况下使用它是必需的,可以吗?只是我,还是我们把一生的子类型关系弄错了?
编辑:(*) 根据#rust
IRC 频道中的 Ms2ger,情况就是这样。它还符合Items
迭代器中使用的逆变生命周期标记的文档。
Edit2:ConvariantLifetime 和 CovariantLifetime 标记已被删除。我们现在在标记模块中有PhantomData
一个替代品。
java - JAVA:子类型和继承的概念是一回事吗?
根据此答案末尾的注释,看起来子类型和继承在 Java 中是不同的概念。它是什么?只有当类声明包含extends ...
子句时才继承?如果是这种情况,那么一个类将不会从 Object 继承,即使它是它的子类型,对吗?
scala - 从非协变类的实例创建协变类型类的实例
假设我有一个简单的类型类,它的实例会给我某种类型的值:
我有一些例子:
现在我有一个类似(但不相关)的类型类,它做同样的事情,但它的类型参数是协变的:
在它的伴生对象中,我们告诉编译器如何从我们的非协变类型类的实例中创建实例:
现在我希望implicitly[GiveMeA[Foo]]
编译得很好,因为只有一种方法可以得到GiveMeA[Foo]
我们这里的给定部分。但它没有(至少不是在 2.10.4 或 2.11.2 上):
如果我们摆脱不相关的GiveMeJustA
实例,它会起作用:
尽管事实上我们无法应用GiveMeA.fromGiveMeJustA
此实例来获取 a GiveMeA[Foo]
(或 的任何子类型GiveMeA[Foo]
)。
这对我来说似乎是一个错误,但我可能遗漏了一些东西。这有道理吗?有没有合理的解决方法?
isabelle - 如何在 Isabelle 中定义子类型及其含义?
关于 Isabelle 中的子类型的问题在这里非常冗长。所以我的简单问题是,如果我将 A 定义如下,我如何将类型 B 定义为 A 的子类型:
通过这样做,我想让 B 类型的元素可以访问在 A 上定义的所有操作和关系(它们未在此处打印)。
一个更复杂的例子是将 B 和 C 定义为 A 的子类型,这样 B 和 C 是不相交的,并且 A 的每个元素要么属于 B 类型,要么属于 C 类型。
谢谢