c# - 从子继承访问抽象类成员
问题描述
我有一个名为 Flight 的抽象类,它实现了一个名为 IFlight 的接口,它有一个虚拟方法,另外三个继承自它的类,这三个类之间的唯一区别是这个方法的实现。我想做的另一件事是实现一个方法,该方法接受 IFlight 类型的对象(可能是这三个类之一)作为参数,并且我想从它们访问抽象类(Flight)的成员。有什么方法可以实现这样的事情?
航班:
class AbsFlight: IFlight
{
public int ID { get; set; }
public string Start_Point { get; set; }
public virtual float Calculate_Price(float Base_Price)
{
return Base_Price;
}
}
其中一个类(其他两个看起来相似,除了方法“Calculate_Price”):
class Charter: AbsFlight
{
public override float Calculate_Price(float Base_Price)
{
return base.Calculate_Price(Base_Price) * 3;
}
}
主要的:
private static void Some_Method(IFlight flight)
{
Console.WriteLine(flight.Calculate_Price(2)); //OK
Console.WriteLine(flight.ID); //Error
}
static void Main(string[] args)
{
List<IFlight> flights = new List<IFlight>();
flights.Add(new Regular());
flights.Add(new Charter());
flights.Add(new LowCost());
Main_SomeMethod(flights[0]);
}
解决方案
您的方法应该接受具有所需属性的类型,在本例中为AbsFlight
类。
private static void Some_Method(AbsFlight flight)
{
Console.WriteLine(flight.Calculate_Price(2));
Console.WriteLine(flight.ID); //OK
}
但是假设该方法必须接受任何IFlight
. 在这种情况下,它不能确定它收到了 AbsFlight;它必须检查。检查后,您可以进行施法。
private static void Some_Method(IFlight flight)
{
Console.WriteLine(flight.Calculate_Price(2));
if (flight is AbsFlight)
{
Console.WriteLine(((AbsFlight)flight).ID); //OK
}
}
对于 c#7,如果您认为它更清晰,您可以使用一个额外的构造:
private static void Some_Method(IFlight flight)
{
Console.WriteLine(flight.Calculate_Price(2));
switch (flight)
{
case AbsFlight absFlight:
Console.WriteLine(absFlight.ID); //OK
break;
}
}
推荐阅读
- arduino - 为什么这个简单的代码打印错误的值
- docker - 具有默认秘密路径的 Hashicorp Vault 配置文件 (v1)
- amazon-web-services - 为什么 AWS ECS Fargate 没有实例类型?
- c++ - C++:再次输入 ComplexNumber(虚部和实部)运算符 ComplexNumber,依此类推
- php - 基于选项选择的表单操作更改仅在在家时有效
- python-3.x - Series 的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() 错误
- python - 如何从 .txt 文件中创建一个数据框,其中标题混合在行中,无需迭代?
- javascript - 尝试通过 React 应用程序从 azure 文件共享中下载文件
- pdf - rmarkdown::pandoc_convert 从 md 到 pdf
- javascript - 为什么在 Google Cloud 中调用 HTTP 函数时出现 UNAUTHORIZED 错误?