c# - OOP:理解抽象

标签 c# class oop inheritance

为了更好地理解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/

相关文章:

c# - 在不访问源代码的情况下覆盖 NUnit 中的 ToString

c# - 3 层 - 模型重用?

java - 子类调用父类递归java

scala - 如何使用akka-http设计一个rest api以便于测试?

c# - 内部安全检查,如何做到100%的代码覆盖率?

c# - 读取作为 blob 上传的 azure 中的 excelsheet

android - 将单独类中的 onClickListener 添加到 xml 布局

c++ - 如何重载 == 运算符而不使其成为友元函数?

java - 接受大写字符串输入

java - 将java中的货币从 float 转换为整数