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
, 请问这样做合理吗? 好像没见过类似的写法.