【问题标题】:How to access the properties of an instance of a derived class which is passed as a parameter in the form of the base class如何访问以基类形式作为参数传递的派生类实例的属性
【发布时间】:2011-11-27 02:38:30
【问题描述】:

在 C# 中,我有一个基类和一个派生类。

我有一个以基类作为输入参数的函数

public void SomeFunction(BaseClass InstanceOfDerivedClass)

有没有一种方法可以访问派生类特有的属性,即使它已作为基类传递?我可以使用 GetType 或 Cast 或类似的东西吗?

我明白解决方案可能并不优雅,但目前的替代方法是为不同的派生类重复此功能多次。

【问题讨论】:

    标签: c# inheritance polymorphism derived-class base-class


    【解决方案1】:

    你可以这样做(不好的方式):

    public void SomeFunction(BaseClass instanceOfDerivedClass)
    {
        DerivedClass derived = null;
    
        if(instanceOfDerivedClass is DerivedClass)
        {
            derived = instanceOfDerivedClass as DerivedClass;
            // Do stuff like :
            int prop = derived.DerivedProperty;
        }
    }
    

    或者,按照 Eric 的建议(好方法):

    public void SomeFunction(BaseClass instanceOfDerivedClass)
    {
        DerivedClass derived = instanceOfDerivedClass as DerivedClass;
    
        if(derived != null)
        {
            // Do stuff like :
            int prop = derived.DerivedProperty;
        }
    }
    

    【讨论】:

    • 正确的想法。极其冗长的实现。干脆DerivedClass derived = instanceOfDerivedClass as DerivedClass; if (derived != null) ...
    【解决方案2】:

    强制转换绝对可以解决问题,因为堆中的引用是对该类的引用。可能是这样的:

    if (InstanceOfDerivedClass is DerivedClass)
    

    你可以在那个方块中施放它并与之互动。

    但更大的问题是,您为什么需要这样做?如果作为参数接受的类型不是正确的类型,则听起来此方法使用了错误的抽象。这打破了 Liskov 替换,看起来像是重构设计的主要候选者。 (其中我们知道的不够多,无法提供太多帮助。)

    【讨论】:

    • 你能详细介绍一下如何投射它吗?对不起,我是菜鸟。
    • @Caustix:没问题。最直观和优雅的方式可能是 Amaud 指出的,使用“as”关键字将变量解释为不同的类型。 “InstanceOfDerivedClass as DerivedClass” 在您的代码中还值得注意的是,您的变量以大写字母开头(这就是 StackOverflow 上的代码解释器将其显示为类型的原因)。这不是严格的惯用 C#。以小写字母开头更为标准。而且,和以前一样,我不能强调这种类型转换不是一个理想的解决方案。它会起作用,但这是一种解决方法。
    • @大卫。谢谢。我将开始另一个问题,该问题将扩展更广泛的问题,看看是否有人可以提供帮助。准备好后将链接粘贴到此处。再次感谢。
    • @大卫。如果您有兴趣,请发布更广泛的问题here。解决这个其他问题的一种方法是执行上述操作。
    猜你喜欢
    • 2018-03-21
    • 2015-04-19
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多