Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我们仍然可以在抽象类中使用抽象属性时,抽象属性的用途是什么?_C#_.net_Inheritance - Fatal编程技术网

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没错,我编辑了我的答案来反映这一点。