C# 当我们仍然可以在抽象类中使用抽象属性时,抽象属性的用途是什么?
让我们先看看这个例子:C# 当我们仍然可以在抽象类中使用抽象属性时,抽象属性的用途是什么?,c#,.net,inheritance,C#,.net,Inheritance,让我们先看看这个例子: using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(obj
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Person p = new Manager();
Manager p2=new Manager();
p.Name = "Ahmad";
p.Introduce();
p.SayHello();
p2.SayHello();
p2 = (Manager)p;
p2.SayHello();
}
}
public abstract class Person
{
protected Person()
{
Name = "Reza";
Introduce();
}
public abstract string Name { get; set; }
public void SayHello()
{
Name = "Ali";
MessageBox.Show(Name);
}
public abstract void Introduce();
}
public class Manager : Person
{
public new void SayHello()
{
MessageBox.Show("Test2");
}
public override string Name { get; set; }
public override void Introduce()
{
MessageBox.Show("Hello " + Name);
}
}
}
起初,我并没有为基类编写构造函数
据我所知,抽象方法的目的是迫使派生类从中实现,因此我们不能在基类中实现抽象方法
然后我添加了一个抽象属性。我看到我们可以在基类中初始化这个属性并使用它
1st:抽象的目的不是仅仅声明它们并让派生类实现它吗?为什么我们可以在基类中使用属性? 我们可以首先实现一个非抽象属性,这没有什么区别 然后我添加了构造函数,事情变得更复杂了。我们可以在构造函数中使用import()方法从子类调用import()(我从调试器了解到这一点) 所以孩子从父亲那里继承,但我们称之为“从父亲继承孩子”中的方法,这很奇怪,而且在某种程度上违背了继承的规则 2:我错过了什么? 编辑: 抽象的目的不是仅仅声明它们并让它们派生吗 类来实现它?为什么我们可以在基类中使用属性 不能在基类中使用抽象属性,因为不能直接实例化它。创建抽象属性的原因与创建抽象方法的原因相同,即确保派生类型实现它 您的
Name
属性实际上没有使用基类实例。当从SayHello
调用时,它将转到Name
的派生类型实现并使用它
所以这里Child继承自父,但我们在Child中调用一个方法
父亲,这很奇怪,在某种程度上违反了法律的规定
遗产我错过了什么
这不仅奇怪,它是一个错误,可能会导致运行时异常,因为子对象尚未初始化。如果要访问通过管理器构造函数(而不是通过字段初始化)在导入
中实例化的管理器
的任何成员,则会出现异常:
public class Manager : Person
{
public Manager()
{
s = "Hello";
}
private string s;
public override string Name { get; set; }
public override void Introduce()
{
Console.WriteLine(s.ToLower());
}
}
现在调用introduct
时,您将看到NullReferenceException
,因为s
尚未初始化
若要对派生类型调用抽象方法,请确保在对象实例化之后执行该操作。可能通过基础上的初始化方法
有关更多信息,请阅读:
如果在构造函数中进行虚拟方法调用,而它不是
继承层次结构中的大多数派生类型,它将被调用
在其构造函数尚未运行的类上,因此可能不会
处于合适的状态以调用该方法
我在基类中使用了抽象属性,在SayHello方法中实例化了Name属性并使用了它。关于第二个答案,我没有得到任何编译错误。我没有得到运行时验证,你注意到Person p=new Manager()了吗;在第一行,我仍然没有得到任何运行时异常,即使是在调试模式下。您在哪一行得到错误。确保键入的内容与我的相同。是的,您不一定会遇到运行时异常。它取决于调用构造函数的顺序。这当然不好practice@afrogonabike没错,我编辑了我的答案来反映这一点。