你好。
我有一个类层次结构。从二进制文件中读取类。它们通过二进制编码开头的代码来区分。我想使用该代码来区分它们。
我想知道每个类返回其类型,覆盖方法或覆盖访问器的最佳选择。
让我举一个例子,其中3个类继承自抽象类......一大块代码说出千言万语。
// ENUM WITH TYPE CODES
enum CONCRETE_CLASS_TYPE : byte
{
CONCRETE_0 = 0xCA,
CONCRETE_1 = 0xFE,
CONCRETE_2 = 123
}
//选项A:覆盖方法
abstract class AbstractClass
{
public abstract CONCRETE_CLASS_TYPE type();
}
class ConcreteClass0 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type()
{
return CONCRETE_CLASS_TYPE.CONCRETE_0;
}
}
class ConcreteClass1 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type()
{
return CONCRETE_CLASS_TYPE.CONCRETE_1;
}
}
class ConcreteClass2 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type()
{
return CONCRETE_CLASS_TYPE.CONCRETE_2;
}
}
//选项B:覆盖附件
abstract class AbstractClass
{
public abstract CONCRETE_CLASS_TYPE type {get;}
}
class ConcreteClass0 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type
{
get { return CONCRETE_CLASS_TYPE.CONCRETE_0; }
}
}
class ConcreteClass1 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type
{
get { return CONCRETE_CLASS_TYPE.CONCRETE_1; }
}
}
class ConcreteClass2 : AbstractClass
{
public override CONCRETE_CLASS_TYPE type
{
get { return CONCRETE_CLASS_TYPE.CONCRETE_2; }
}
}
优点和缺点是什么?
我已经看到覆盖方法的优点是,如果手动完成,代码将更容易翻译成其他语言。
我在使用访问器中看到的优点是每当我需要知道类型并且在语义上更正确时,备用写2个括号。
您在选项中看到了哪些其他优点或缺点?一个比另一个更有效吗?
谢谢。
修改
也许使用方法更快,因为我们可以使用访问器做的所有事情(比如解析JSON)必须有成本,而方法只能被称为"。
答案 0 :(得分:1)
在我看来,没有任何优势,如果你需要传递参数或需要进行冗长的计算然后使用函数,但如果你要返回或设置一个私有的局部变量,你需要在设置或获取变量之前运行检查使用属性,这是我查看使用属性或函数
这样的另一个问题是When to use properties instead of functions
[问题回答:Reed Copsey]
当使用属性时,如果属性将:
何时使用函数可以考虑结果值是否需要:
此外,我建议您查看Microsoft's Design Guidelines for Property Usage。他们建议:
当成员是逻辑数据成员时使用属性。
在以下时间使用方法:
- 该操作是转换,例如Object.ToString。
- 操作非常昂贵,您希望与用户沟通,他们应该考虑缓存结果。
- 使用get访问器获取属性值会产生可观察到的副作用。
- 连续两次致电会员会产生不同的结果。
- 执行顺序很重要。请注意,应该能够以任何顺序设置和检索类型的属性。
- 该成员是静态的,但返回一个可以更改的值。
- 该成员返回一个数组。返回数组的属性可能会产生误导。通常需要返回内部数组的副本,以便用户无法更改内部状态。这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下。在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本。结果,将在以下循环中创建2n + 1个阵列副本。
答案 1 :(得分:1)
两者都是糟糕的解决方案,因为两者都沉迷于责任的扩散。你已经分散了从枚举和四个班级确定一个班级的责任。
相反,有一个工厂类负责根据代码提供类类型。粗略地说,代码可能是:
Type GetTypeBasedonCode(int code)
{
if (code == 0xCA)
{
return typeof(ConcreteType0);
}
if (code == 0xFE)
{
return typeof(ConcreteType1);
}
return typeof(ConcreteType2);
}
有更好的方法来实现这样的工厂,但关键是代码/类型匹配在一个地方,使其更容易阅读,理解和维护。