这是我的另一个“我认为这不可能,但我需要确认”问题。
我有一堆子类的基类。现在,这个基类有一些孩子们使用的常见属性,比如Name
。基础是一个抽象类(MustInherit)。从技术上讲,这意味着每次实例化子类时,它都会在内存中隐藏自己的Name
副本。问题是,Name
将成为给定孩子的所有实例的固定值。即,Child1.Name
将返回"child_object1"
,Child2.Name
将返回"child_object2"
。
此属性似乎是共享属性的完美候选者,但随后出现问题。似乎如果我将Name
定义为基类中的共享属性,无论子类派生自哪个子类,都将共享相同的Name
,这是共享属性的确切目的(或者方法等)。
我能想到的唯一解决方法是从基类中删除Name
并在每个子类中直接将其重新实现为共享属性。尽管如此,这似乎打败了拥有基类的功能。至少在原则上。
所以我的问题是从设计角度解决这个问题的首选方法是什么?假设来自单个抽象基类的至少50个派生子类。
答案 0 :(得分:1)
我假设你说“儿童对象”是指“儿童类”。不要混淆术语;这让你的问题更加混乱。
那就是说,我自己多次使用过这种模式。您认为共享/静态是正确的,但您不能在此处应用它,因为从基类派生的类的每个实例都可以具有不同的名称。我没有看到有一个被覆盖的抽象属性返回一个常量值的错误。
考虑一下 - 抽象成员的目的是允许子类提供它们自己的实现。当你问一个物体“你叫什么名字?” 某些需要知道的事情。子类本身就是这些数据的理想之地,实现抽象成员非常有意义。
如果Name属性将根据类型本身的名称返回某些内容,则可以使用GetType().Name
获取该属性,因此可能能够将某些名称代码合并到默认的虚拟实现中属性,并在默认实现不正确时覆盖它。这可以消除大量的样板代码,从而可以忽略不计的性能损失。
(为了回答问题标题中提出的问题,是的,从技术上讲,所有类型的非私有共享/静态成员都会被所有子类型继承。但是你不能覆盖它们,因为这对共享/静态成员没有意义。)