为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?
我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
有人可以向我解释模板方法模式和策略模式之间的区别是什么?
据我所知,它们是99%相同 - 唯一的区别是模板方法模式有一个抽象类作为基类,而策略类使用由每个具体策略类实现的接口.
但是,就客户而言,它们的使用方式完全相同 - 这是正确的吗?
背景:
作为Java程序员,我从接口广泛继承(而不是:实现),有时我设计抽象基类.但是,我从来没有真正觉得需要子类化一个具体的(非抽象)类(在我这样做的情况下,后来发现另一个解决方案,例如委托会更好).
所以现在我开始觉得几乎没有从具体类继承的合适的情况.一方面,Liskov替换原则(LSP)似乎几乎不可能满足非平凡类; 还有许多其他问题,这里似乎呼应了类似的意见.
所以我的问题:
在哪种情况下(如果有的话)从具体类继承它真的有意义吗?你能给出一个继承自另一个具体类的类的具体的,真实的例子吗?你觉得这是给定约束的最佳设计吗?我对满足LSP的示例(或满足LSP似乎不重要的示例)特别感兴趣.
我主要有Java背景,但我对任何语言的例子感兴趣.
我试图从泛型类派生我的类:
class foo<T> {}
class bar : foo<Int> {}
Run Code Online (Sandbox Code Playgroud)
但是此代码无法使用en错误进行编译:
从泛型类派生的类也必须是通用的
如何避免这种限制?可能吗?
我必须承认我有点像OOP怀疑论者.面向对象的不良教学和实验经验无济于事.所以我转变成了Visual Basic中的狂热信徒(经典之作!).
然后有一天我发现C++已经改变了,现在有了STL和模板.我真的很喜欢!使语言有用.然后另一天MS决定对VB进行面部手术,我真的很讨厌无端更改的最终结果(使用"end while"而不是"wend"会让我成为一个更好的开发者?为什么不放下"next"for"结束了",为什么呢?为什么强迫getter和setter一起?等等?加上我发现无用的Java特性(例如继承,以及分层框架的概念).
现在,几年后,我发现自己在问这个哲学问题:遗产真的需要吗?
四人一组说我们应该支持对象组合而不是继承.在考虑它之后,我找不到你可以用继承做的事情,你不能用对象聚合和接口做.所以我想知道,为什么我们甚至在第一时间拥有它?
有任何想法吗?我很想看到一个例子,说明继承器肯定需要在哪里,或者使用继承而不是组合+接口可以导致更简单和更容易修改的设计.在以前的工作中,我发现如果你需要更改基类,你还需要修改几乎所有的派生类,因为它们取决于父行为.如果你使基类'方法虚拟...那么没有太多的代码共享发生:(
另外,当我最终创建自己的编程语言(我发现大多数开发人员共享的长期未满足的愿望)时,我认为添加继承没有任何意义......
最近我在求职面试时被问到这个问题,我无法回答.那么,java.io中最常用的模式是什么?它是如何使用的?常见的Java库中使用的其他模式有哪些?
我像往常一样构建了一个用户控件,它由XAML部分和代码隐藏部分组成.现在,我需要创建另一个用户控件,它共享前者的一些功能,但它们具有不同的外观,并且可能在代码隐藏中具有其他功能.
我的第一个想法是创建一个接口来收集两种控件的常用功能.这是正确的方法吗?我将如何管理我应该拥有的不同XAML部件?欢迎任何建议.
投资组合A→基金1
投资组合A→基金2
投资组合A→基金3
如果不使用is/has,我无法构建句子.但在1和2之间,
1)有一个:
class PortfolioA
{
List<Fund> obj;
}
Run Code Online (Sandbox Code Playgroud)
2)是:
class PortfolioA : List<Fund>
{
}
Run Code Online (Sandbox Code Playgroud)
从可扩展性,可用性的角度来看,您认为哪一个更好?我仍然可以通过任何方式访问我的资金,尽管有一个小的语法变化.
这里有没有人有关于何时用户继承以及何时使用标识符的意见?
继承示例:
class Animal
{
public int Name { get; set; }
}
class Dog : Animal {}
class Cat : Animal {}
Run Code Online (Sandbox Code Playgroud)
标识符示例:
class Animal
{
public int Name { get; set; }
public AnimalType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在什么情况下我应该选择哪种解决方案以及它们的优缺点是什么?
/丽娜
如何在不采用父类型的情况下从其他类继承?
例如,我希望能够Car采用所有方法和属性Vehicle而不被识别为类型的对象Vehicle.
有没有一种方便的方法在Java中执行此操作而不重复所有方法和属性?
拥有以下类,在两个不同的程序集中:
class Member
{
public string Label {get;set;}
// Lots of other fields...
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width * Length;
}
// Other methods
}
class OtherMember
{
public string CompositeLabel {get;set;}
// Lots of other fields (not related to other class: Member)
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关扩展方法以及如何使用新方法扩展类而无需更改类代码定义的内容.我想知道是否有类似的方法可以将新数据成员(如List或数组)添加到现有类并使用数据成员来存储与该类相关的信息?
inheritance ×6
oop ×5
java ×4
c# ×3
composition ×2
interface ×2
aggregation ×1
class ×1
generics ×1
io ×1
liskov-substitution-principle ×1
model ×1
refactoring ×1
swift ×1
types ×1
wpf ×1