如何访问以基类形式作为参数传递的派生类实例的属性

本文关键字:参数传递 派生 属性 实例 何访问 访问 基类 | 更新日期: 2023-09-27 18:09:53

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

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

public void SomeFunction(BaseClass InstanceOfDerivedClass)

是否有一种方法可以访问特定于派生类的属性,即使它已作为基类传递?我能使用GetType或Cast之类的吗?

我知道解决方案可能不是很优雅,但目前的替代方案是为不同的派生类多次重复此函数。

如何访问以基类形式作为参数传递的派生类实例的属性

强制类型转换肯定能达到这个目的,因为堆中的引用就是对那个类的引用。比如:

if (InstanceOfDerivedClass is DerivedClass)

在那个块中你可以cast它并与它交互

但更大的问题是,你为什么需要这样做?如果接受作为参数的类型不是正确的类型,那么听起来这个方法使用了错误的抽象。这打破了Liskov代换,看起来是重构设计的主要候选。(我们对这方面的了解还不够多。)

你可以这样做(坏方法):

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;
    }
}