请问这种嵌套的继承关系该如何实现?

B类继承自A类, β类继承自α类. 同时α作为A类的成员变量, β作为B类的成员变量.
现希望调用B实例的父类方法时, 能使用自身环境中的β实例而非(不存在的)α实例. 于是将成员α设为virtual, 成员β重写之并返回β对象.

我是新手, 请问这样设计合理吗? 另外, 为了访问β实例中的非继承字段, B类中的β字段必须设为 public, 这样会带来额外的问题吗?



public class Alpha
{
    public string name = "This is Alpha";

}

public class Beta: Alpha
{
    public string otherName = "This is Beta";
}

public class A
{
    public virtual Alpha alpha
    {
            get => _alpha;
            set => _alpha = value;
    }
    private Alpha _alpha

    public virtual void PrintSelf()
    {
        print(alpha.name);
    }
}

public class B: A
{
    public override Alpha alpha
    {
            get => _beta;
            set{}
    }
    // public?
    private Beta _beta;
}


public class Main
{
    var b = new B();
    b.PrintSelf();
}
    

请 GPT 设计了一下.
Q: B类继承自A类, β类继承自α类. 同时α作为A类的成员变量, β作为B类的成员变量.
现希望调用B实例的父类方法时, 能使用自身环境中的β实例而非(不存在的)α实例. 请为我设计一段c#代码实例
A:
为了实现您的需求,我们可以使用C#中的多态性和组合的概念。基本思路是在B类中重写继承自A类的方法,并在这个重写的方法中使用B类的成员变量β。同时,确保A类的方法能够以某种方式接受或使用α类的实例。

// 定义α类
public class α
{
    public virtual void SomeMethod()
    {
        Console.WriteLine("α的方法被调用");
    }
}

// 定义β类,继承自α
public class β : α
{
    public override void SomeMethod()
    {
        Console.WriteLine("β的方法被调用");
    }
}

// 定义A类,其中包含一个α类型的成员变量
public class A
{
    protected α αInstance;

    public A()
    {
        αInstance = new α();
    }

    public virtual void CallMethod()
    {
        αInstance.SomeMethod();
    }
}

// 定义B类,继承自A,并包含一个β类型的成员变量
public class B : A
{
    private β βInstance;

    public B() : base()
    {
        βInstance = new β();
        αInstance = βInstance; // 将αInstance指向βInstance
    }

    public override void CallMethod()
    {
        βInstance.SomeMethod(); // 使用β实例调用方法
    }
}

// 使用示例
class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        b.CallMethod(); // 这将调用β中的SomeMethod
    }
}

关键是这一句 αInstance = βInstance; // 将αInstance指向βInstance, 请问这样做合理吗? 好像没见过类似的写法.

阅读 383
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏