Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# - Fatal编程技术网

C# 具有派生属性的派生类

C# 具有派生属性的派生类,c#,C#,我有两个类都是从基类X派生的。基类包含一个类T的属性。X的两个子类都应该包含一个从T派生的属性 我想要实现的是在基类X中声明T的a属性并在几个方法中使用它,同时在X的派生类中使用T的相同属性,但将其识别为T的派生类,这样我就不必每次使用它时都强制转换它 我的解决方案之一就是从基类中删除属性,并复制X的每个派生类的方法,但这会破坏使用继承的目的 这样的事情可以实现吗 internal class TestObject { public string ID; public XObje

我有两个类都是从基类X派生的。基类包含一个类T的属性。X的两个子类都应该包含一个从T派生的属性

我想要实现的是在基类X中声明T的a属性并在几个方法中使用它,同时在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
{
    //....
}

使属性类型成为基类的泛型参数:

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添加了一些代码,以使我更清楚地了解我想要实现的目标