我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
这可能是一个通用的OOP问题.我想根据它们的用法在接口和抽象类之间进行一般性比较.
什么时候想要使用接口?何时想要使用抽象类?
我对C#中抽象类的使用有点困惑.在C++中,定义一个继承抽象类的类可以遵循的模板是有意义的.但是,在C#中,Interface不具备相同的用途吗?
确实,抽象类可以具有接口不提供的默认实现.因此,如果实现不需要包含在基类中,那么最好选择接口吗?
如果我们可以通过将类中的所有成员都设置为抽象来实现接口功能,那么为什么抽象类和接口都存在于C#中.
是因为:
请澄清
对于我的新宠物项目,我有一个设计问题,已经确定了,但我也想要其他一些意见.
我有两个类(简化):
class MyObject
{
string name {get;set;}
enum relation {get;set;}
int value {get;set;}
}
class MyObjectGroup
{
string name {get;set;}
enum relation {get;set;}
int value {get;set;}
List<MyObject> myobjects {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在项目后期MyObjectGroup,并MyObject应同等地使用.为此,我可以采取两种方式:
IObjectObjectBase我决定采用界面的方式,我后来在代码中不能ObjectBase每次都写,而IObject只是为了方便 - 但这种方式的其他积极因素是什么?
第二,如何增加IXmlSerializable整个故事呢?让接口继承IXmlSerializable或者它是否有更多的正面要IXmlSerializable在抽象基类中实现?
如果我有一个包含类似类的项目,有些可能使用相同的实现,但在大多数情况下,它们实现了自己的方法来处理接口或抽象类中定义的方法.我试图弄清楚接口/抽象类是否更好.如果你可以使用虚拟抽象方法的抽象类,我不明白接口的意义.
这是一个界面:
public interface IAthlete
{
void Run();
}
Run Code Online (Sandbox Code Playgroud)
这是一个抽象类:
public abstract class Athlete
{
public abstract void Run();
}
Run Code Online (Sandbox Code Playgroud)
这是接口的实现:
public class Sprinter : IAthlete
{
public void Run()
{
Console.WriteLine("Running Fast....");
}
}
Run Code Online (Sandbox Code Playgroud)
这是抽象类的扩展:
public class MarathonRunner : Athlete
{
public override void Run()
{
Console.Write("Jogging....");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我决定向接口或抽象方法添加一个名为Stop的方法,Sprinter和MarathonRunner都会中断,因为我可以提供一些默认的抽象实现,这似乎是一个更好的选择.我错过了什么吗?
你能否给我一个对抽象类和继承使用几乎过于简单化的理解并帮助我,这样我才能真正理解这个概念以及如何实现?我有一个项目,我正在努力完成,并且失去了如何实施.我一直在和我的教授聊天,并被告知,如果我无法弄明白,我可能还没准备好上课.我已经完成了prequestite课程,但仍然无法理解这些概念.
澄清一下,到目前为止,我所做的项目如下.我还没有填写狗/猫类等.你能指点一下吗?我不是要求任何人给我"答案".我只是迷失在哪里.我参加在线课程,他与我的沟通工作一直令人不安.我刚刚完成了所有其他课程的4.0,所以我愿意付出努力,但我对这些概念的理解以及如何实际应用它们感到迷茫.
是否有任何意见或帮助可以让我在这个项目中取得进一步进展?
我要实现的内容如下:
概述:
本练习的目的是演示Interfaces,Inheritance,Abstract classes和Polymorphism的使用.您的任务是获取提供的程序shell并添加适当的类和相应的类成员/方法,以使此程序正常运行.您不能对提供的任何代码进行更改,您只能添加您编写的类.尽管有许多方法可以使程序正常工作,但您必须使用演示Interfaces,
Inheritance,Abstract classes和Polymorphism的技术.同样,为了清楚起见,您可以添加到提供的代码,但不能更改或删除任何代码.提供的代码将使用非常少的附加代码,并将满足练习的要求.如果成功完成分配,程序应在运行时输出以下语句:
我的名字是Spot,我是一只狗
我的名字是费利克斯,我是一只猫
要求:
1)您必须有一个名为"Animal"的抽象基类,Dog和Cat类可以从中派生出来.
2)Animal基类必须从接口'IAnimal'派生,它是唯一应该从IAnimal派生的类.
3)由于所有动物都有一个名字,一个名字不是一个特定于狗或猫的属性,动物
基类应该是存储名称的位置以及实现WhatIsMyName get-property的位置.
4)您需要创建一个仅从Animal基类派生的Dog和Cat类.
5)Dog和Cat类应该实现WhatAmI get-property并返回相应的字符串值.
您无法更改的代码:
using System;
namespace IT274_U2
{
public interface IAnimal
{
string WhatAmI { get; }
string WhatIsMyName { get; }
}
public class TesterClass
{
public static void DescribeAnimal(IAnimal animal)
{
Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
}
static void Main(string[] args)
{
Dog mydog = new Dog("Spot");
Cat mycat = new Cat("Felix");
DescribeAnimal(mydog);
DescribeAnimal(mycat); …Run Code Online (Sandbox Code Playgroud) 可能是最着名的软件开发人员面试问题之一.
你的答案是什么?
编辑:我想知道如何在现实生活中回答这个问题.请尝试像在实际面试时一样制定答案(完整,但不要太长,当然不发布任何链接).