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