我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
假设我们有两个方法M1(),并M2()在接口.抽象类也有两个相同的抽象方法.如果任何类实现了此接口或从抽象类继承,则必须同时实现其中的方法.
所以对我来说,似乎我的场景中的接口或抽象类的行为相同.那么,任何人都可以在这个特定的情况下突出显示这两者之间的区别,并建议是否在这里使用抽象类或接口?
我对C#中抽象类的使用有点困惑.在C++中,定义一个继承抽象类的类可以遵循的模板是有意义的.但是,在C#中,Interface不具备相同的用途吗?
确实,抽象类可以具有接口不提供的默认实现.因此,如果实现不需要包含在基类中,那么最好选择接口吗?
如果我们可以通过将类中的所有成员都设置为抽象来实现接口功能,那么为什么抽象类和接口都存在于C#中.
是因为:
请澄清
我有一个标有属性的类[XmlText],它接受多行输入.在我的XML文件中,我已经验证了文本内容中的行结尾是非常的"\r\n",与文件的其余部分相同.
我用来反序列化的代码是:
XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList));
string file = "test.xml";
if (File.Exists(file))
{
using (TextReader r = new StreamReader(file))
{
foo = configSerializer.Deserialize(r);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在该[XmlText]物业的制定者内部,value已经有"\n"一条线结束.这令人讨厌的主要原因是因为"\n"线路末端没有正确显示TextBox...我不确定哪个部分导致了问题,但我认为这里的某个人可能能够对这种情况有所了解.
大家好,
我只是在思考抽象类和接口,我知道它们在技术上是如何工作的,但我不了解抽象类和接口的实际用途.我的意思是,当我们知道无法创建它的对象时,为什么我们应该使用抽象类,我们不得不扩展这个类来使用它,所以为什么我们不把所有东西都放在派生类中.
接口也是如此,我们必须实现接口,所以为什么我们不把接口中定义的所有方法都放在我们实现接口的类中.
有人可以用一些例子清楚我的怀疑吗?
可能重复:
正确使用IDisposable接口
我试图通过书籍,互联网和stackoverflow找到我的问题的实际答案,但到目前为止没有任何帮助我,所以希望我可以说明我的问题足够有意义.
一般来说,我总是找到与如何释放内存相同的基本用法,即约.如下,我确实理解代码本身:
public class MyClass : IDisposable
{
bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Dispose(true);
GC.SuppressFinalize(this);
disposed = true;
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//free managed ressources
}
// free other ressources
}
~MyClass()
{
Dispose(false);
}
}
Run Code Online (Sandbox Code Playgroud)
它完全理解方法的工作方式.但现在我的问题是:为什么我们需要基类IDisposable?在此代码示例,我们定义了一个名为方法Dispose().当我到处读到该方法是IDisposable的一部分时,我们刚刚定义了该方法MyClass,如果我们不实现基类IDisposable或者我错误的假设,这段代码仍然有用吗?
我对C#并不是全新的,但我仍然需要学习很多东西,所以希望有人可以带领我朝着正确的方向前进.我检查了另一篇同样问题的帖子,但找不到它,所以如果它确实存在且它确实回答了我的问题,请带我到那里,我将删除这篇文章.
我已经开始担任支持开发人员的职业,但我梦想着为S / W开发人员找到一份工作。我正在用C#学习OOPS。通常让我烦恼的一件事是接口和抽象类的用法。何时使用接口以及何时使用抽象类。我在这个主题上搜索了google,但是无论浏览什么答案,我都看到所有人都在尝试解释什么是抽象和接口,但是我不是按照他们的定义,而是希望看到它们在实际程序中的实际用法。在这里,我想强调一个使用接口的代码,但我认为全部内容也可以使用抽象类进行设计。
如果我将存储库公开为接口,请参见下面的存储库设计模式代码,其中已使用接口
public interface IEmployeeRepository
{
Employee[] GetAll();
}
Run Code Online (Sandbox Code Playgroud)
那么优势将是我可以有如下所示的多种实现
public class EmployeeRepositoryEF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying your EF DbContext
}
}
public class EmployeeRepositoryXML: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying an XML file
}
}
public class EmployeeRepositoryWCF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying some remote WCF service
}
}
Run Code Online (Sandbox Code Playgroud)
请参见上面的代码,该代码具有一个协定方法,GetAll()
并且谁将扩展接口,然后他们可以提供自己的实现。那是优点,但是我的问题是我可以在这里写抽象类而不是接口吗?
假设我有一个抽象类 …
c# ×8
oop ×5
interface ×3
.net ×2
base-class ×2
class ×1
idisposable ×1
memory ×1
newline ×1
xml ×1