假设我有一个继承树,如下所示:
Car -> Ford -> Mustang -> MustangGT
Run Code Online (Sandbox Code Playgroud)
为每个类定义接口有什么好处?例:
ICar -> IFord -> IMustang -> IMustangGT
Run Code Online (Sandbox Code Playgroud)
我可以看到,也许其他类(如Chevy)将要实施Icar或IFord,甚至IMustang,但可能不是IMustangGT因为它是如此具体.在这种情况下接口是多余的吗?
另外,我认为任何想要实现的类IFord肯定都希望通过继承来使用它的一个继承,Ford以免重复代码.如果这是给定的,那么实施的好处是IFord什么?
来自C#背景的F#.
在C#中,决定何时使用接口以及何时使用抽象类有明显的区别.在F#中,我看到两个模糊几乎合二为一.据我所知,就CLR而言,在F#中就c#做了同样的事情,但在使用F#进行编程时,"最佳实践"是什么?
我应该完全避免类继承吗?
查看以下(简化)类的层次结构:
> Email (base class)
> SimpleEmail extends Email
> HtmlEmail extends Email
Run Code Online (Sandbox Code Playgroud)
我需要修饰Email.send()以添加限制功能.我需要实例化SimpleEmail,HtmlEmail或其他类似的Email子类.
这个模式到底应该是什么样的?我的猜测(需要纠正)如下:
class abstract EmailDecorator
-> Define a constructor: EmailDecorator(Email component)
-> Implements all methods of Email and passes values through to component
-> Adds functionality to send() method
class SimpleEmailDecorator extends EmailDecorator
-> Define a constructor: SimpleEmailDecorator(SimpleEmail component)
-> Implement all methods of SimpleEmail and pass through to component
class HtmlEmailDirector extends EmaiDecorator
-> Same as SimpleEmailDecorator
Run Code Online (Sandbox Code Playgroud)
我的大脑并没有围绕我如何正确处理我需要"增强"的基类的重要现有子类.大多数示例将其简化为继承问题变得混乱的程度.
可能的重复:
接口与抽象类(一般面向对象)
以下是我对接口、抽象类和普通类之间的困惑-
我知道抽象类可以有一个没有实现的方法,但是在基类中将方法声明为虚拟方法并在派生类中使用一些虚拟实现和覆盖有什么害处。正在寻找可以验证答案的实际场景?
当我们有了抽象类时,为什么我们需要一个接口,我知道通过接口我们可以有多重继承,并且研究了各种理论原因,寻找抽象类无法帮助你必须使用接口的实际场景?
拥有抽象类和接口不是开销吗?
假设我有一个如下界面.
interface CardHolder : IEnumerable<Card>
{
/// <summary> ...
void PutCard(Card card);
/// <summary> ...
void PutCards(Card[] card);
/// Some more methods...
}
Run Code Online (Sandbox Code Playgroud)
我实现如下.
public class ArrayCardHolder : CardHolder
{
private Card[] _cards;
private int _size = 0;
public ArrayCardHolder(int capacity)
{
_cards = new Card[capacity];
}
public void PutCard(Card card)
{
if (IsFull())
throw new Exception("This CardHolder is full. Capacity: " + Capacity());
_cards[_size++] = card;
}
public void PutCards(Card[] cards)
{
if (_size + cards.Length > _cards.Length)
throw …Run Code Online (Sandbox Code Playgroud) 在我看来,这两个interface和abstract function非常相似,
这就像一个必须实施某些方法的订单,
那有什么区别?
我认为标题可能是错的..哈哈不确定..反正..
我有3种不同的数据类型..
public class data1
{
public Color color;
public int len;
public DrawingVisual dv;
Other vars...
}
public class data2
{
public Color color;
public int len;
public DrawingVisual dv;
Other vars different from data1 vars...
}
Run Code Online (Sandbox Code Playgroud)
等等...
如何创建一个函数来传递这些函数,然后在函数内部获取我需要的变量..示例..
void Something(var data)
{
switch (typeof(data))
{
case data1:
break;
case data1:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这显然不会工作..但它只是一个例子..
我怎么能这样做呢?
谢谢
我一直在阅读一些关于新Java 8功能的文章.随着Extension方法的引入,即以default关键字为前缀并提供实现的方法.
我在这里检查了几个问题,人们已经在这里和这里询问抽象类和接口的差异,最大的区别似乎是抽象类允许你指定默认实现.
这是否意味着抽象类和接口之间的区别很大程度上是美化的,并且考虑到类可以实现多个接口; 它们在设计和实施方面提供了更大的灵活性.
我可以看到抽象类仍然存在,主要是为了向后兼容旧代码.我是不是正确使用未来的抽象类并仅使用接口?如果不能提供示例,只需在抽象类中定义一些字段就不算数了.我正在寻找一个引人注目的用例,与Interfaces相比,Abstract Classes仍然更适合.
另一方面,纯粹主义者会争辩说,默认实现会污染接口,这些接口应该只指定契约,行为应该总是在Concrete类中(行为的一部分可能在抽象类中).这个论点有什么价值吗?
我试过了:
ArrayList<Pelicula> peliculas = YIFY.obtenerPeliculasPorVenir();
Run Code Online (Sandbox Code Playgroud)
是#obtenerPeliculasPorVenir:
public static List<Pelicula> obtenerPeliculasPorVenir(){
List peliculas = null;
try {
peliculas = mapper.readValue(new API().peticionTexto("http://yts.re/api/upcoming.json"), new TypeReference<List<Pelicula>>(){});
}
catch (IOException excepcion) {
System.out.println(excepcion.getMessage());
}
return peliculas;
}
}
Run Code Online (Sandbox Code Playgroud)
如果ArrayList 实现 List为什么我不能这样做?
是铸造唯一的解决方案还是我应该采取另一种OOP方法?
我已经开始担任支持开发人员的职业,但我梦想着为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()
并且谁将扩展接口,然后他们可以提供自己的实现。那是优点,但是我的问题是我可以在这里写抽象类而不是接口吗?
假设我有一个抽象类 …
我可以在接口中声明函数和属性,但我无法实现它们.当我从界面继承时,我现在必须在我的班级中实现所有这些成员.如果我必须这样做,那么声明界面有什么意义呢?
例如,这是一个示例界面:
namespace InterfaceExample
{
public interface IVehicle
{
int Doors { get; set; }
int Wheels { get; set; }
Color VehicleColor { get; set; }
int TopSpeed { get; set; }
int Cylinders { get; set; }
int CurrentSpeed { get; }
string DisplayTopSpeed();
void Accelerate(int step);
}
}
Run Code Online (Sandbox Code Playgroud)
我已在此界面中声明了所有属性和函数.现在,当我在我的班级中使用这个界面时:
namespace InterfaceExample
{
public class Motorcycle : IVehicle
{
private int _currentSpeed = 0;
public int Doors { get; set; }
public int Wheels { get; set; } …Run Code Online (Sandbox Code Playgroud) 我想知道aan interface和abstract班级之间的区别是什么?有什么利弊,什么时候应该使用什么?
在这些问题旁边,我还可以使用抽象类进行依赖注入吗?因为我正在使用DI并且想要声明静态字段/私有方法