c# - 无需强制转换即可访问对象的属性

标签 c# oop inheritance

我有以下三个类

public class Base
{
    string name;
}

public class Foo : Base
{
    int value;
}

public class Bar : Base
{
    double value;
}

这就是我想要的

Base current = null;

if (somecondition)
    current = new Foo();
else
    current = new Bar();

for (int i=0; i<5; i++)
{
    current.value = i;           
}

问题是 VS 2010 在循环体中显示错误,因为 Base 没有属性 value

现在,我可以通过这种方式解决这个问题:

Base current = null;
bool isBar = true;

if (somecondition)
{
    current = new Foo();
    isBar = false;
}
else
    current = new Bar();

for (int i=0; i<5; i++)
{
    if (isBar)
        (current as Bar).value = i;          
    else
        (current as Foo).value = i;
}

但我希望有一个更好的解决方案,因为一旦循环开始迭代,current 的类型就不会改变,但我将测试该类型并相应地为每个类型转换它迭代。

执行此操作的正确方法是什么?

最佳答案

在使字段可访问(或将它们公开为可访问属性)之后,您的选择是:

  • 使您的基类抽象化,使用抽象方法或属性来设置值(并可能返回它)——这里的问题是当两种类型不同时您不能轻易做到这一点
  • 创建一个接口(interface)来做同样的事情,并转换为接口(interface)
  • 像现在一样转换
  • 如果您使用的是 C# 4,请使用 dynamic - 只需将 current 声明为 dynamic,您就可以分配给 current。 value 编译器将插入代码以在执行时计算出来
  • 重新设计您的代码/继承层次结构

就我个人而言,我至少会考虑最后一种方法 - 继承在这里绝对合适吗? value 的两种类型真的需要不同吗?它们是否具有相同的含义?如果是这样,将值推送到基类并在您需要不同类型时可能使其通用化是否有意义?

关于c# - 无需强制转换即可访问对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9256224/

相关文章:

c# - 系统.Data.MetadataException : Unable to load the specified metadata resource

php - 接口(interface)如何用于松散耦合?

c++ - C++ 中的值语义技巧

python - python类继承的基本用法

c# - 将数据从 RecyclerView 元素传递到新 Activity (Xamarin)

c# - 更改 DocumentCompleted 中 Web 浏览器控件的大小

c# - 当应用重新获得焦点时重新启动 MediaCapture

c# - 从 C# 访问 XAML 实例化对象

objective-c - 如果我重写派生类中的方法,是否应该在派生类的 header 中再次声明它?

c++ - 同时为类及其成员继承和多态(shared_ptr,C++11)