- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果之前有人问过类似的问题,我提前道歉,正确描述我要找的东西是相当复杂的,我将用一个例子来解释。
我们将使用名为 Shape
的基类以及以下子类:Triangle
、Square
、Pentagon
和 六边形
。最后 4 个类分别代表具有 3、4、5 和 6 条边的形状。此信息“属于”类本身,而不属于这些类的实例。
我们还将假设每个类都有一个返回给定颜色的静态方法。给定类的每个实例都将共享相同的颜色。
我想做的是按边数的升序调用我的形状的静态函数getColor()
。意思是,我想调用:
三角.getColor()
Square.getColor()
Pentagon.getColor()
Hexagon.getColor()
不幸的是,我有以下问题(许多编程语言共有)
我不能使用接口(interface),因为信息不属于实例,而是属于类
我无法在我的 Shape
类中定义 getSideCount()
静态函数,因为我无法在我的子类中“覆盖”它得到正确的边数
我不要求完整的代码,只要求设计建议来解决这个问题。也许我完全错了,我不应该走这条路。不要犹豫,批评并建议一种新的方法来做到这一点。
如果你想要一个更“具体”的例子:
我有一个字符串myString
。
我有多个类 A
、B
、C
定义了 toString
方法。
a.toString()
返回 1 个字符的字符串b.toString()
返回 2 个字符的字符串c.toString()
返回 3 个字符的字符串myString
是 a.toString()
、b.toString()
和 c.toString()< 的串联
: ABBCCC
.
明天,我可能希望 myString
是 c.toString()
、a.toString()
和 的串联b.toString()
: CCCABB
.因此,我在类 A
、B
和 C
中定义了一个静态方法,返回实例在 myString 中的表示位置
。我想要做的是以正确的顺序提取我的实例的表示。
执行此操作的“长”方法是:
index ← 0
if( A.position == 1 )
aStr ← extract( myString, index, 1 )
index ← index + 1
elif ( B.position == 1 )
bStr ← extract( myString, index, 2 )
index ← index + 2
elif ( C.position == 1 )
cStr ← extract( myString, index, 3 )
index ← index + 3
endif
if( A.position == 2 )
aStr ← extract( myString, index, 1 )
index ← index + 1
elif ( B.position == 2 )
bStr ← extract( myString, index, 2 )
index ← index + 2
elif ( C.position == 2 )
cStr ← extract( myString, index, 3 )
index ← index + 3
endif
if( A.position == 3 )
aStr ← extract( myString, index, 1 )
index ← index + 1
elif ( B.position == 3 )
bStr ← extract( myString, index, 2 )
index ← index + 2
elif ( C.position == 3 )
cStr ← extract( myString, index, 3 )
index ← index + 3
endif
预先感谢您的宝贵时间和帮助。
最佳答案
有几种方法可以解决这个问题。
如果您的语言支持(Scala、F#、Haskell),可能最简单的方法是模式匹配。通过支持(详尽的)模式匹配,您可以区分对象类型:
// syntax will differ from language to language,
// but you should get the idea
def getColor(s: Shape): Color = s match {
case Triangle => Color.Blue
case Square => Color.Yellow
...
}
这有效地移动了 getColor
类之外的方法,但是你不会用普通的“switch-case”得到的很酷的事情是,如果你没有涵盖所有的情况,编译器会警告你,所以你有效地获得了相同的编译时保证与抽象方法一样。
一般来说,您需要的是一种从类型映射到值的方法,所以您不妨只需使用 map 。在 C# 中,您将使用 Dictionary<Key, Value>
:
static readonly Dictionary<Type, Color> _shapeToColor;
// use this to register a color for each type somewhere at the beginning
public static Register<T>(Color color) where T : Shape
{
_shapeToColor[typeof(T)] = color;
}
// generic version for compile-time read
public static Color GetColor<T>() where T : Shape => _shapeToColor[typeof(T)];
// or a parameterized version for run-time read
// (but might fail if incorrect type passed)
public static Color GetColor(Type t) => _shapeToColor[t];
// or generally
public static Color GetColor(object x) => _shapeToColor[x.GetType()];
这为您提供了更大的灵 active ,但您很容易忘记为新添加的类型注册颜色。此外,您可能会注册一个 ShapeInfo
为每种颜色分类,并在其中放置多个 Color
, 这样您就没有多本词典了。
另一个选项(同样是 C# 示例,抱歉,如果您使用的是 Java)是将实例方法与之前的想法(静态字典)和一些反射 。这个想法会是这样的:
interface IShape
{
Color GetColor();
}
class Triangle : IShape
{
public Color GetColor() => Color.Blue;
}
class Square : IShape
{
public Color GetColor() => Color.Red;
}
static void InitializeValues()
{
// use reflection to iterate through all types
var asm = Assembly.GetAssembly(typeof(IShape));
foreach (var t in asm.GetTypes())
{
// find all Shapes
if (t.IsInterface ||
t.IsAbstract ||
!typeof(IConfigTokenizer).IsAssignableFrom(t))
continue;
// instantiate a temporary shape
var inst = (IShape)Activator.CreateInstance(t);
// but we are only interested in creating
// a mapping to the result of GetColor
_shapeToColor[t] = inst.GetColor();
}
}
但是现在您已经用 toString
更新了问题东西,我不再确定你的实际目标是什么。 :)
关于oop - 使用子类中定义的静态方法进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910503/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在 C# 静态方法中是否有一种方法可以引用定义该方法的类型? 在实例方法中,您可以通过以下方式确定类型: public void Foo() { Type type = this.GetTyp
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: <Window
任何人都知道如何在共享/静态函数中动态加载控件?该函数本身位于 mustinherit/abstract 类中。 (这是 VB 中的 ASP.NET 项目)我想做这样的事情: VB: Publ
在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当您更改任何 API,那么编译器会告诉您该更改破坏了什么。 我可以想象用运行时/弱类型语言编写代码......但我无法想象没有编译器的帮
正如我的名字所暗示的,我是一名 .NET 开发人员,但我对 Java 的兴趣越来越大,并且我有兴趣学习更多其他语言,因为这有助于我学习更多关于编程的知识。 无论如何,我的问题是:不带参数/不使用状态的
我在java中使用WireMock来 stub POST请求。该请求返回一个存储在我本地的 json 正文文件。 stub 看起来像这样: wireMockServer.stubFor(get(url
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
这个问题已经有答案了: What is the difference between dynamic and static polymorphism in Java? (14 个回答) 已关闭 4 年
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Static initializer in Java 我想知道这个静态的东西(抱歉,这是我第一次遇到这个)对一个类有
如果c++应用程序是按以下方式组织的 //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //fil
我有一个抽象类(AvergedDataRecord),我需要进一步抽象(DataRecord),这样我就可以将它扩展到原始类和一个新的具体类(SummedDataRecord),并且我在获取某些方法时
我正在尝试制作一个字符串枚举。这是我到目前为止所得到的, private class TypedEnum : IEnumerable { public IEnumerator GetEnume
我选修了一门名为“安全代码”的类(class),在下一个作业中,我们应该对一些 C 文件和 JavaEE Web 项目进行静态/动态分析。 我检查了“源监视器”并在 C 文件上运行它,但是(除非我不知
我有两个类,一个是登录类,一个是用户类。在 loggedIn 类中,我想显示我在用户登录时所做的共享首选项。 loginPrefs = getSharedPreferences("loginprefe
我在同一个 Activity 中有两个静态 fragment ,在“fragmentA”中我有一个自定义列表,当一个项目被点击时必须在“fragmentB”中出现一个细节,细节只在我改变屏幕方向时出现
在 Java 中是未修改方法变量,缺少final,每次都重新初始化限定符 静态方法 实例方法 如果 1. 或 2.(或两者)的答案是 final 限定符允许 Java 执行优化并存储方法变量只有一次?
我有两个类相互交互。第一个是中心的,如下: public class Datenbank { double winkelPanel = 0; double groessePanel = 0; doub
我有一个 mysql 数据库,它连接基于 Web 的 php 应用程序和 FoxPro 应用程序(是的,foxpro)。在之前的“开发人员”被解雇后开始处理这个问题。 无论如何,我熟悉 AES_Enc
我是一名优秀的程序员,十分优秀!