C#指定派生字段是从其原始类派生的

时间:2018-08-14 10:43:24

标签: c# inheritance

假设我有AB的类CDB:AD:C

A的字段包含一个C对象,该对象继承到B,并且在A中以不同的方法使用。我知道要指定B中的对象,它不仅是C对象,而且是D对象,但仍要利用A中对{ {1}}个对象。

C

具体来说,我需要它来实现二叉树。二进制搜索树(BST)的根是BST节点,并提供了利用它的不同方法。红黑树也是BST,但根是RBT节点,它也是BST节点,但还具有颜色属性。

3 个答案:

答案 0 :(得分:4)

您可以使用通用基类来执行所需的操作。尝试从此开始:

public abstract class A<T> where T : C
{
    public T Obj { get; set; }

    public void DoStuff()
    {
        Console.WriteLine(typeof(T).FullName);
        Console.WriteLine(this.Obj.GetType().FullName);
    }
}

现在您可以轻松定义AB

public class A : A<C>
{
}

public class B : A<D>
{
    public void DoMoreStuff()
    {
        this.DoStuff();
        Console.WriteLine(this.Obj.GetType().FullName);
    }
}

如果我运行以下代码:

var a = new A() { Obj = new C() };
var b = new B() { Obj = new D() };

a.DoStuff();

Console.WriteLine("...");

b.DoMoreStuff();

我得到:

C
C
...
D
D
D

答案 1 :(得分:0)

使用泛型非常容易:

public class A<T> where T : C 
{
    public T Obj { get; set; }

    public void DoStuff()
    {
        // Do stuff with Obj (C)
    }
}


public class B<T> : A<T> where T : D // this condition is valid since D inherits C
{
    public T Obj { get; set; } 

    public void DoMoreStuff()
    {
        // Do stuff with Obj (D)
    }
}

public class C 
{
    // ...
}

public class D : C
{
    // ...
}

答案 2 :(得分:0)

您可以添加一些泛型来访问所需的属性。我觉得这是一项家庭作业,所以我只提供一些基础知识。查看代码中的注释以获取更多详细信息

public abstract class BaseTree<TNode>
    where TNode : BaseNode // TNode must be at least (base class) a BaseNode
{
    // Can be a collection as well, depending on your needs
    public TNode Node { get; set; }

    public void DoStuff()
    {
        // Node is a BaseNode
    }
}

// Any node in this tree is a RedBlackNode
public class RedBlackTree : BaseTree<RedBlackNode>
{
    public void DoMoreStuff()
    {
        // Node is a RedBlackNode
    }
}

public abstract class BaseNode
{
}

public class RedBlackNode : BaseNode
{
}