我有两个派生自基类X的类。基类包含类T的属性.X的两个子类都应包含一个派生自T的属性。
我想要实现的是在基类X中声明T的属性并将其用于多个方法中,同时在X的派生类中使用T的相同属性,但将其识别为派生类来自T的类,所以每次我想使用它时都不需要它。
我的一个解决方案是从基类中删除属性并为每个派生类的X复制方法,但这会破坏使用继承的目的。
这样的事情是可以实现的吗?
internal class TestObject
{
public string ID;
public XObject obj;
//....
}
internal class TestDocument : TestObject
{
public XDocument obj; //<--- want to be able to call obj in my methods
//as if it were an XDocument type but relate to the obj property in the base class
//....
}
internal class XObject
{
//....
}
internal class XDocument : XObject
{
//....
}
答案 0 :(得分:3)
泛型应该适合你:
class Base<T> where T: MyType
{
T MyProperty { get; set; }
public void DoSomething()
{
// do something with MyProperty
}
}
MyType
是Base
内属性的基类。
然后在派生类中,您可以定义泛型约束,例如
class Derived : Base<DerivedType>
{
}
现在,Derived
的实例的属性MyProperty
的类型为DerivedType
,而不是MyType
。
因此,在您的情况下,TestObject
应与此类似:
internal class TestObject<T> where T: XObject
{
public string ID;
public T obj;
//....
}
internal class TestDocument : TestObject<XDocument>
{
// obj is here of type XDocument
}
答案 1 :(得分:1)
使属性的类型成为基类的通用参数:
class PropertyTypeBase { }
class PropertyTypeA : PropertyTypeBase { }
class Base<T> where T : PropertyTypeBase
{
public T Property { get; }
}
class Foo : Base<PropertyTypeA>
{
public Foo()
{
PropertyTypeBase x = Property;
PropertyTypeA a = Property;
}
}
答案 2 :(得分:1)
最简单的方法是使基类具有通用性,并约束从某个类派生的泛型参数:
class BaseProp { }
class DerivedPropA: BaseProp { }
class DerivedPropB : BaseProp { }
abstract class X<T>
where T: BaseProp
{
public T Value { get; set; }
public abstract void With(T value);
}
class A : X<DerivedPropA>
{
public override void With(DerivedPropA value)
{
this.Value = value;
}
}
class B : X<DerivedPropB>
{
public override void With(DerivedPropB value)
{
this.Value = value;
}
}
答案 3 :(得分:1)
这可以通过使用泛型来实现。
首先,让我解释一下示例类。让我们说这些是你的属性:
public class BaseHead {}
public class OrganicHead : BaseHead {}
public class CyborgHead : BaseHead {}
现在,您希望在个人课程中实现这些目标:
public class BaseCreature {}
public class OrganicCreature : BaseCreature {}
public class CyborgCreature : BaseCreature {}
解决方案:
public class BaseCreature<THead> where THead : BaseHead
{
public THead Head { get; set; }
public BaseCreature(THead head)
{
this.Head = head;
}
}
BaseCreature
通用THead
类型限制为仅允许BaseHead
或派生自BaseHead
的类型但是,我们还希望确保正确的生物(有机/机器人)只使用正确的头部(有机/机器人)。这可以通过从具有特定泛型类型的BaseCreature
派生来完成:
public class OrganicCreature : BaseCreature<OrganicHead>
{
public OrganicCreature(OrganicHead head) : base(head)
{
}
}
CyborgCreature
类似。
假设你想让每个生物都可以使用每种类型的头部。如果这是你想要的,那么你需要保持通用参数通用:
public class OrganicCreature<THead> : BaseCreature<THead> where THead : BaseHead
{
public OrganicCreature(THead head) : base(head)
{
}
}
CyborgCreature
类似。