gpt4 book ai didi

c# - OOP:理解抽象

转载 作者:太空狗 更新时间:2023-10-30 00:07:31 25 4
gpt4 key购买 nike

为了更好地理解abstraction,我浏览了很多文章和一些 Stack Overflow 问题,但我有点困惑。这就是我一直在阅读的内容:here

Abstraction is "To represent the essential feature without representing the background details."Abstraction lets you focus on what the object does instead of how it does it.

给出的代码:

abstract class MobilePhone
}
public void Calling();
public void SendSMS();
}

public class Nokia1400 : MobilePhone
{

}

public class Nokia2700 : MobilePhone
{
public void FMRadio();
public void MP3();
public void Camera();
}

我的问题是,当我们继承抽象类时,我们不是在我们的子类中实现了细节吗?
calling() 和 sendSms() 在父类(super class)型中没有任何实现,所以当我们在子类中实现它时,我们也应该了解背景细节。那么抽象在这个例子中实际上是如何工作的呢?

编辑:如果您来这里寻求帮助,这些人会给出最佳答案:复杂性 Sergey Berezovskiy

最佳答案

首先,您的代码中存在几个问题。

  • 抽象类确实包含没有主体的方法并且不是抽象的,因此这是无效的。您应该将方法抽象化,或者在其中提供主体。当你想要一个主体但又希望能够覆盖方法时,必须应用 virtual 关键字。所以这是您对抽象类的选择:

没有主体的方法:

abstract class MobilePhone
{
public abstract void Calling();
public abstract void SendSMS();
}

方法体可以被覆盖:

abstract class MobilePhone
{
public virtual void Calling()
{
// Code goes here.
}

public virtual void SendSMS()
{
// Code goes here.
}
}

方法体不能被覆盖:

abstract class MobilePhone
{
public void Calling()
{
// Code goes here.
}

public void SendSMS()
{
// Code goes here.
}
}

然后还有几个问题。您的抽象类没有提供默认情况下使对象私有(private)的构造函数,因此您的类 Nokia1400 和 Nokia2700 不能从基类继承,因为基类比抽象类更难访问。

现在,根据您创建抽象类的方式,实现它的类必须满足一些要求:

  • 当您的基类确实包含抽象成员时,它应该在您的继承类中实现。
  • 如果您的基类确实包含虚拟成员,则不应在您的继承类中实现它,但如果需要可以覆盖它。

而且,你的最后一个类也没有编译,因为它确实包含没有主体的方法。这些类型的方法只有在它们是抽象的情况下才被允许,并且它们必须在抽象类中。

这是一个基于您的代码的示例:

public abstract class MobilePhone
{
public virtual void Calling()
{
Console.Write("Calling");
}

public abstract void SendSMS();
}

public class Nokia1400 : MobilePhone
{
public override void SendSMS()
{
Console.WriteLine("Sending SMS from Nokia 1400.");
}
}

public class Nokia2700 : MobilePhone
{
public void FMRadio()
{
Console.WriteLine("FM Radio");
}

public void MP3()
{
Console.Write("MP3");
}

public void Camera()
{
Console.WriteLine("Camera");
}

public override void SendSMS()
{
Console.WriteLine("Sending SMS from Nokia 2700.");
}
}

所以,一篇相当长的文章,但我希望它有所帮助。

关于c# - OOP:理解抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23948130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com