c# - 我如何声明派生的 "shell"类,它们除了重命名外什么都不做?

标签 c# .net generics inheritance defensive-programming

我在代码中传递和使用了两种不同类型的字符串,这两种字符串密切相关,但不应相互混淆。我想我可以通过拥有两个只是字符串但具有不同名称的类来帮助自己避免错误,这样方法签名(以及一般的类型不兼容)将强制执行两种不同类型字符串的语义。同时,我不想从 something = "foo"; 重构。至 something.Value = "foo";在一百个地方。

第一个想法:

private class FirstKind : string { }
private class SecondKind : string { }

想法是如果我有

void MyMethod(FirstKind varOne, SecondKind varTwo) {...}

,然后尝试用 MyMethod(secondKindVar, firstKindVar); 调用它,我会得到一个编译器错误。

我撞到的墙:string是密封的。

第二个想法:创建通用 KindOf<T>类除了使用隐式转换运算符接收和吐出值外什么都不做。像这样:

private class KindOf<T>
{
    public T Value { get; set; }
    public KindOf() { Value = default(T); }
    public KindOf(T val) { Value = val; }
    public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
    public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}

这样我就可以做这样的事情:

private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }

我撞墙了:KindOf<T> 什么都没有类似乎是继承的:派生类型中既不存在构造函数也不存在运算符,这意味着我必须在派生类中基本上重新实现整个基类。代码复制。呸。

所以我觉得我在这里缺少一些基本的东西,也许我在杂草丛生。对我正在尝试做的事情有什么想法吗?

最佳答案

老实说,我根本不会使用隐式运算符,也不会使用任何继承。整个想法是有一个采用FirstKind 的方法。使用隐式运算符,您只需传入一个字符串,它就会被转换;这意味着您不会强制代码明确声明它是第一类/第二类。我会坚持使用两个类,每个类只有一个构造函数接受一个字符串和一个只读属性。添加任何其他内容会使它过于复杂。

如果使用该属性变得烦人,我可能会从每个自定义类中看到隐式转换 to 字符串,但我确实相信隐式转换来自 字符串是有害的。虽然我同意通常要避免复制/粘贴代码,但当它实际上是一行代码时,将隐式转换复制粘贴到两个类中会比尝试使用继承或其他任何方法更容易、更有效,而且通常更易于维护避免写两次。

关于c# - 我如何声明派生的 "shell"类,它们除了重命名外什么都不做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140701/

相关文章:

delphi - 如何防止为泛型类生成重复的代码?

C# 在不创建实例的情况下获取属性值?

c# - 卸载 Application Insights nuget 包是否安全?

.net - 什么时候应该在.NET中放置对象?

c# - 如何以编程方式打开特定的彭博终端页面?

java - 如何在类中引用嵌套模板参数的嵌套类型?

java - 泛型,当方法参数为 ( List<? extends T) 时,不适用于 List<integer> 的参数

c# - Mindscape.Lightspeed 错误 : Invalid object name 'KeyTable'

c# - Collection<T> 不包含 ICollection 接口(interface)的所有属性

C# 控制台应用程序用户可编辑设置