【发布时间】:2010-05-25 21:19:59
【问题描述】:
注意:这个问题是用类似 C# 的伪代码编写的,但我真的要问哪些语言有解决方案。请不要拘泥于语法。
假设我有两个班级:
class AngleLabel: CustomLabel
{
public bool Bold; // Just upping the visibility to public
// code to allow the label to be on an angle
}
class Label: CustomLabel
{
public bool Bold; // Just upping the visibility to public
// Code for a normal label
// Maybe has code not in an AngleLabel (align for example).
}
他们都来自这个班级:
class CustomLabel
{
protected bool Bold;
}
粗体字段在后代类中公开。
类上没有可用的接口。
现在,我有一个方法,我希望能够传入一个 CustomLabel 并设置 Bold 属性。是否可以做到这一点而不必 1) 找出对象的真实类是什么,2) 转换为该对象,然后 3) 为每个标签类型的每个变量制作单独的代码以设置粗体。有点像这样:
public void SetBold(customLabel: CustomLabel)
{
AngleLabel angleLabel;
NormalLabel normalLabel;
if (angleLabel is AngleLabel )
{
angleLabel= customLabel as AngleLabel
angleLabel.Bold = true;
}
if (label is Label)
{
normalLabel = customLabel as Label
normalLabel .Bold = true;
}
}
最好进行一次强制转换,然后在一个变量上设置粗体。
我想的是创建第四个类,它只公开粗体变量并将我的自定义标签投射到该类。
这行得通吗?
如果是这样,它适用于哪些语言? (这个例子取自旧版本的 Delphi (Delphi 5))。我不知道它是否适用于那种语言,(我仍然需要尝试一下)但我很好奇它是否适用于 C++、C# 或 Java。
如果没有,有什么想法可行吗? (记住没有提供接口,我不能修改类。)
有人猜到了吗?
【问题讨论】:
-
你为什么要这样做?
-
不能
AngleLabel和Label靠Control的bold标志生活?为什么他们必须有自己的? (如果Control.bold与问题无关,为什么要显示它?) -
@sbi - 很抱歉造成混淆,我将删除控件引用。正如我所说,这个例子来自 Delphi。 Delphi 中的控件类没有粗体属性。
-
@~mathepic - 示例方法 show 实际上比仅设置粗体值更大。 (我简化了它。)在较大的方法中,我有许多设置相同值的冗余行,但对于 AngeleLabel 或 Label。我想通过只在一个地方进行更改来降低维护搞砸的风险。
-
您造成了一些混乱,因为看起来您的后代类正在声明 他们自己的
bold字段,而实际上您只是想说明它们只是在改变对继承自祖先类的字段的访问。
标签: c# c++ delphi inheritance casting