Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在派生类中,如何从基类中的属性类型获得派生类型的属性?_C#_Oop - Fatal编程技术网

C# 在派生类中,如何从基类中的属性类型获得派生类型的属性?

C# 在派生类中,如何从基类中的属性类型获得派生类型的属性?,c#,oop,C#,Oop,这是我经常遇到的一个巨大的设计问题,我认为这是因为我不理解OOP 以下是基本属性的类别: public class BasePropety {} 以下是my DerivedProperty的类型: public class DerivedProperty : BaseProperty { public AClass A { get; set; } } 这是我的基本类: public class BaseClass { public BaseProperty Property

这是我经常遇到的一个巨大的设计问题,我认为这是因为我不理解OOP

以下是基本属性的类别:

public class BasePropety {}
以下是my DerivedProperty的类型:

public class DerivedProperty : BaseProperty
{
    public AClass A { get; set; }
}
这是我的基本类:

public class BaseClass
{
    public BaseProperty Property { get; set; }
}
下面是我的派生类:

public class DerivedClass : BaseClass
{
    public DerivedProperty Property { get; set; }

    public void MethodExample()
    {
        AClass aValue = this.Property.A;
    }
}
我当然可以打印我的财产,但这很烦人:

public class DerivedClass : BaseClass
{
    public void MethodExample()
    {
        var typedProperty = (DerivedProperty) this.Property;
        AClass aValue = typedProperty.A;
    }
}
我知道我可以使用新的关键字,但我读到这里和那里,这是一个坏的做法,那么我应该如何实现这一点?我应该创建一个新的属性吗


提前感谢您的回答。

听起来您需要的是仿制药:

public class BaseClass<T> where T : BaseProperty
{
    public T Property { get; set; }
}

public class DerivedClass : BaseClass<DerivedProperty>
{
    public void MethodExample()
    {
        AClass aValue = Property.A;
    }
}
公共类基类,其中T:BaseProperty
{
公共T属性{get;set;}
}
公共类派生类:基类
{
public-void-MethodExample()
{
AClass aValue=Property.A;
}
}

请注意,这意味着只有一个属性——而在当前代码中,实际上有两个独立的属性,它们恰好具有相同的名称。我怀疑你不想这样。

听起来你需要的是泛型:

public class BaseClass<T> where T : BaseProperty
{
    public T Property { get; set; }
}

public class DerivedClass : BaseClass<DerivedProperty>
{
    public void MethodExample()
    {
        AClass aValue = Property.A;
    }
}
公共类基类,其中T:BaseProperty
{
公共T属性{get;set;}
}
公共类派生类:基类
{
public-void-MethodExample()
{
AClass aValue=Property.A;
}
}

请注意,这意味着只有一个属性——而在当前代码中,实际上有两个独立的属性,它们恰好具有相同的名称。我想你不会想要的。

这很符合我的需要。我确实不想让它看起来像我想要两个独立的属性。谢谢你的回答。这很符合我的需要。我确实不想让它看起来像我想要两个独立的属性。谢谢你的回答。