C# 具有派生属性的派生类
我有两个类都是从基类X派生的。基类包含一个类T的属性。X的两个子类都应该包含一个从T派生的属性 我想要实现的是在基类X中声明T的a属性并在几个方法中使用它,同时在X的派生类中使用T的相同属性,但将其识别为T的派生类,这样我就不必每次使用它时都强制转换它 我的解决方案之一就是从基类中删除属性,并复制X的每个派生类的方法,但这会破坏使用继承的目的 这样的事情可以实现吗C# 具有派生属性的派生类,c#,C#,我有两个类都是从基类X派生的。基类包含一个类T的属性。X的两个子类都应该包含一个从T派生的属性 我想要实现的是在基类X中声明T的a属性并在几个方法中使用它,同时在X的派生类中使用T的相同属性,但将其识别为T的派生类,这样我就不必每次使用它时都强制转换它 我的解决方案之一就是从基类中删除属性,并复制X的每个派生类的方法,但这会破坏使用继承的目的 这样的事情可以实现吗 internal class TestObject { public string ID; public XObje
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
{
//....
}
使属性类型成为基类的泛型参数:
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;
}
}
使属性类型成为基类的泛型参数:
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;
}
}
仿制药应该适合您:
class Base<T> where T: MyType
{
T MyProperty { get; set; }
public void DoSomething()
{
// do something with MyProperty
}
}
现在,派生实例的属性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
}
仿制药应该适合您:
class Base<T> where T: MyType
{
T MyProperty { get; set; }
public void DoSomething()
{
// do something with MyProperty
}
}
现在,派生实例的属性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
}
最简单的方法是使基类泛型,并将泛型参数约束为从某个类派生:
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;
}
}
最简单的方法是使基类泛型,并将泛型参数约束为从某个类派生:
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;
}
}
这可以通过使用泛型实现 首先,让我解释一下示例类。假设这些是您的财产:
public class BaseHead {}
public class OrganicHead : BaseHead {}
public class CyborgHead : BaseHead {}
现在,您希望在person类上实现这些Head:
public class BaseCreature {}
public class OrganicCreature : BaseCreature {}
public class CyborgCreature : BaseCreature {}
解决方案:
电子生物疗法是类似的
假设你想让每种生物都能使用每种类型的头。如果这是您想要的,那么您需要保持generic参数generic:
public class OrganicCreature<THead> : BaseCreature<THead> where THead : BaseHead
{
public OrganicCreature(THead head) : base(head)
{
}
}
电子生物疗法是类似的。这可以通过使用仿制药来实现 首先,让我解释一下示例类。假设这些是您的财产:
public class BaseHead {}
public class OrganicHead : BaseHead {}
public class CyborgHead : BaseHead {}
现在,您希望在person类上实现这些Head:
public class BaseCreature {}
public class OrganicCreature : BaseCreature {}
public class CyborgCreature : BaseCreature {}
解决方案:
电子生物疗法是类似的
假设你想让每种生物都能使用每种类型的头。如果这是您想要的,那么您需要保持generic参数generic:
public class OrganicCreature<THead> : BaseCreature<THead> where THead : BaseHead
{
public OrganicCreature(THead head) : base(head)
{
}
}
CyborgCreate是类似的。你能发布一些伪代码以便更容易理解你想要的东西吗?听起来对泛型很划算。@Camiloteriento添加了一些代码以使我更清楚地了解我想要实现的目标。你能发布一些伪代码以便更容易理解你想要的东西吗?听起来对泛型很划算泛型。@Camiloterevento添加了一些代码,以使我更清楚地了解我想要实现的目标