我不能从子类中的基类继承共享属性,可以吗?

时间:2010-12-29 08:56:04

标签: vb.net

这是我的另一个“我认为这不可能,但我需要确认”问题。

我有一堆子类的基类。现在,这个基类有一些孩子们使用的常见属性,比如Name。基础是一个抽象类(MustInherit)。从技术上讲,这意味着每次实例化子类时,它都会在内存中隐藏自己的Name副本。问题是,Name将成为给定孩子的所有实例的固定值。即,Child1.Name将返回"child_object1"Child2.Name将返回"child_object2"

此属性似乎是共享属性的完美候选者,但随后出现问题。似乎如果我将Name定义为基类中的共享属性,无论子类派生自哪个子类,都将共享相同的Name,这是共享属性的确切目的(或者方法等)。

我能想到的唯一解决方法是从基类中删除Name并在每个子类中直接将其重新实现为共享属性。尽管如此,这似乎打败了拥有基类的功能。至少在原则上。

所以我的问题是从设计角度解决这个问题的首选方法是什么?假设来自单个抽象基类的至少50个派生子类。

1 个答案:

答案 0 :(得分:1)

我假设你说“儿童对象”是指“儿童类”。不要混淆术语;这让你的问题更加混乱。

那就是说,我自己多次使用过这种模式。您认为共享/静态是正确的,但您不能在此处应用它,因为从基类派生的类的每个实例都可以具有不同的名称。我没有看到有一个被覆盖的抽象属性返回一个常量值的错误。

考虑一下 - 抽象成员的目的是允许子类提供它们自己的实现。当你问一个物体“你叫什么名字?” 某些需要知道的事情。子类本身就是这些数据的理想之地,实现抽象成员非常有意义。

如果Name属性将根据类型本身的名称返回某些内容,则可以使用GetType().Name获取该属性,因此可能能够将某些名称代码合并到默认的虚拟实现中属性,并在默认实现不正确时覆盖它。这可以消除大量的样板代码,从而可以忽略不计的性能损失。

(为了回答问题标题中提出的问题,是的,从技术上讲,所有类型的非私有共享/静态成员都会被所有子类型继承。但是你不能覆盖它们,因为这对共享/静态成员没有意义。)