- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 C# 中,父类(super class)的静态成员被“继承”到子类范围中。例如:
class A { public static int M() { return 1; } }
class B : A {}
class C : A { public new static int M() { return 2; } }
[...]
A.M(); //returns 1
B.M(); //returns 1 - this is equivalent to A.M()
C.M(); //returns 2 - this is not equivalent to A.M()
现在,你不能继承静态类,而我唯一能想到静态继承可能很重要的地方完全忽略了它:尽管你可以创建一个需要类型参数 T
的通用约束是 A
的子类,您仍然不能调用 T.M()
(这可能简化了 VM 的事情),更不用说编写不同的 M
在子类中实现并使用它。
因此,静态成员的“继承”只是看起来像 namespace 污染;即使您明确限定名称(即 B.M
),A
的版本仍会得到解析。
编辑与命名空间比较:
namespace N1{ class X(); }
namespace N1.N2 { class X(); }
namespace N1.N2.N3 { [...] }
在 N1.N2.N3
中 如果我在没有限定的情况下使用 X
,它指的是 N1.N2.X
,这是有道理的。但是如果我明确引用 N1.N2.N3.X
- 并且不存在这样的类 - 我不希望它找到 N2
的版本;如果您尝试这样做,编译器确实会报告错误。相反,如果我明确引用 B.M()
,为什么编译器不报告错误?毕竟,“B”中没有“M”方法……
这种继承的目的是什么?能否以某种方式建设性地使用此功能?
最佳答案
So, the "inheritance" of static members merely looks like namespace pollution
没错,只是一个人的污染是另一个人添加的辛辣调味剂。
我认为 Martin Fowler 在他关于 DSL 的工作中建议以这种方式使用继承以允许方便地访问静态方法,允许在没有类名限定的情况下使用这些方法。因此,调用代码必须位于继承定义方法的类的类中。 (我认为这是一个烂主意。)
在我看来,不应将静态成员混合到具有非静态目的的类中,您在此处提出的问题是不混合它们很重要的部分原因。
将私有(private)静态可变数据隐藏在一个“实例化”类的实现中尤其可怕。但是还有静态方法,这是更糟糕的混合器。下面是混合到类中的静态方法的典型用法:
public class Thing
{
// typical per-instance stuff
int _member1;
protected virtual void Foo() { ... }
public void Bar() { ... }
// factory method
public static Thing Make()
{
return new Thing();
}
}
这是静态工厂方法模式。大多数时候这是毫无意义的,但更糟糕的是现在我们有了这个:
public class AnotherThing : Thing { }
这现在有一个静态的 Make
方法,它返回一个 Thing
,而不是 AnotherThing
。
这种不匹配强烈暗示任何带有静态方法的东西都应该被密封。静态成员无法很好地与继承集成。让它们可遗传是没有意义的。因此,我将静态内容保存在单独的静态类中,并且在我已经说过该类是静态的情况下,我提示不得不将每个成员都声明为静态的。
但这只是那些为时已晚的事情之一。所有真实的工作语言(以及图书馆和产品)都有其中的一些。 C# 非常少。
关于C# 静态成员 "inheritance"- 为什么它存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281775/
我正在为我的项目测试 FlowJS,我遇到了 Type Aliases 的问题. 我为 API 构建了一个 Web SDK:我有一个使用此方法的 Helper 类: class Helper {
我是 Dart 的新手,仍在学习它带来的所有细微差别。我当前的任务真正困扰的一件事是从父类继承(或代理)静态方法。 void main() { EnglishCasual.greet(); } c
我正在尝试巩固 Go 提供的继承概念(也许是“组合”而不是纯粹的继承)。但是,我无法理解为什么我不能将“父”类型用作 func 参数来生成作用于该参数的通用函数。 package main impor
我在准确表述它时遇到问题,所以我在标题中留下了更笼统的描述(如果您对问题有更准确的描述,请发表评论,我会编辑标题)。 问题: AudioStream 和VideoStream 两个类派生自基类Medi
我的应用程序不仅具有“用户”,而且还具有“管理员”和“ super 管理员”。由于所有这三个共享相同的属性,因此我只想使用一个带有附加属性“role”的表,该属性可以是“user”,“admin”或“
我正在使用数据库优先方法和 DbContext。我的数据模型中有几个继承结构 (TPH)。但是 DbContext 只为基类创建一个 DbSet,而没有为子类创建一个 DbSet。我应该如何检索指定子
我正在使用数据库优先方法和 DbContext。我的数据模型中有几个继承结构 (TPH)。但是 DbContext 只为基类创建一个 DbSet,而没有为子类创建一个 DbSet。我应该如何检索指定子
我有一个生成很多子对象的应用程序,每个子对象都与一些全局应用程序对象一起工作,例如在全局应用程序注册表中注册自己,更新应用程序统计信息等。 应用程序应该如何将访问这些全局对象的能力传递给 child
我有 2 个结构,其中一个继承了由 type Common struct {...} 表示的所有结构中共有的值 type Common struct{ Id int CreatedAt
我的代码: Ext.onReady(function() { // Every property is declared inside the class Ext.define('MyCustomPa
我有一个包含多个类的应用程序,这些类继承/是第三方库类的子类。例如,来自 Qt Framework 的 QDialog。 我应该在应用程序的 UML 类图中指定继承关系吗? 是否期望(或标准)表示此类
我遇到了这个问题,因为我认为我对 Backbone 的理解不正确。 我有一个名为 Runnable 的父类(super class)和一组继承自它的子类: var Runnable = Backbon
考虑以下 HTML: foo bar 和 CSS: a { text-decoration:none; border-bottom-width: 0px; border-bot
我想做个模板Class BaseDialog ,但在进行最终对话时 MyDialog1 , 继承了 BaseDialog , 我收到错误,然后无法在设计模式下显示对话框。 以下是我得到的错误列表。 a
我对 android 文档中的这两个术语感到困惑!! these screenshot about what i mean 最佳答案 常量是用 static 和 final 修饰符声明的字段。继承常量
我最近遇到了一个新的警告: 继承构造函数不继承省略号 我正在尝试管道 Object{42}; // ... into an init that handles integers ...和... Obj
我正在使用 TypeScript 开发 Aurelia 应用程序。在此应用程序中,我定义了一组自定义元素,每个元素共享一组可绑定(bind)属性,这些属性被转换为 css 设置,如以下简化示例所示:
我想知道为什么人们会说: “继承类不继承构造函数”。 如果你可以使用父类的构造函数,无参构造函数无论如何都会被自动调用。 例子: #include using namespace std; clas
我刚刚开始探索 Kotlin 语言。我正在为继承、var&val 和副作用而苦苦挣扎。 如果我用 val x 声明一个特征 A 并在 AImpl 中覆盖 x ,则可以将其覆盖为 var(参见下面的代码
我正面临一个编码/解码问题,涉及使用 MOXy 的 JAXB 实现和外部元数据绑定(bind)文件的继承和多态性。 我无法控制 XML 文件或模型类。 模型内部有多个类继承其他 DTO 类。 这是我正
我是一名优秀的程序员,十分优秀!