可能的重复:
接口与基类
在设计C#类库时,何时应该在接口上选择继承?
所以我正在用C#编写我的第一个真正的程序.该计划将从四个不同的网站获取数据.我的计划是让一个父类看起来像这样:
class Scraper
{
string scrapeDate(url);
string scrapeTime(url);
//&c.
}
Run Code Online (Sandbox Code Playgroud)
然后我会有四个继承它的类.
另一种选择是创建Scraper一个接口,并有四个实现它的类.
这些方法有什么区别?
让抽象类定义实例变量是一种好习惯吗?
public abstract class ExternalScript extends Script {
String source;
public abstract void setSource(String file);
public abstract String getSource();
}
Run Code Online (Sandbox Code Playgroud)
然后子类ExternalJavaScript.class将自动获取源变量,但是如果所有子类本身都定义了源代码而不是继承,我觉得读代码更容易.
你有什么建议?
/亚当
这是我的示例抽象单例类:
public abstract class A {
protected static A instance;
public static A getInstance() {
return instance;
}
//...rest of my abstract methods...
}
Run Code Online (Sandbox Code Playgroud)
以下是具体实施:
public class B extends A {
private B() { }
static {
instance = new B();
}
//...implementations of my abstract methods...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我无法在B类中获取静态代码来执行,因此实例变量永远不会被设置.我试过这个:
Class c = B.class;
A.getInstance() - returns null;
Run Code Online (Sandbox Code Playgroud)
还有这个
ClassLoader.getSystemClassLoader().loadClass("B");
A.getInstance() - return null;
Run Code Online (Sandbox Code Playgroud)
在eclipse调试器中运行这两个,静态代码永远不会被执行.我可以找到执行静态代码的唯一方法是将B的构造函数的可访问性更改为public,并调用它.
我在Ubuntu 32bit上使用sun-java6-jre来运行这些测试.
几年前我被迫进入一个工作中的软件项目,并被迫快速学习C#.我的编程背景很弱(经典ASP).
多年来我学到了很多东西,但由于我学习C#的强制性,我还有很多基本概念.
具体来说,一个界面.我理解基础知识,但在编写应用程序时,我很难弄清楚它的实际用途.为什么要为他们的应用程序编写接口?
谢谢凯文
重复:接口与基类
我已经深入了解OOP,设计模式和动作脚本3的世界,我仍然很好奇如何知道何时使用Abstract类(对于不支持Abstract类的AS3的伪)和接口.对我来说,两者都只是作为模板来确保在给定的类中实现某些方法.区别仅在于抽象类需要继承而接口只是扩展吗?
谢谢,Brian Hodge hodgedev.com
可能重复:
接口与基类
通常可以看到使用Interfaces实现的存储库模式
public interface IFooRepository
{
Foo GetFoo(int ID);
}
public class SQLFooRepository : IFooRepository
{
// Call DB and get a foo
public Foo GetFoo(int ID) {}
}
public class TestFooRepository : IFooRepository
{
// Get foo from in-memory store for testing
public Foo GetFoo(int ID) {}
}
Run Code Online (Sandbox Code Playgroud)
但你可以使用抽象类同样地做到这一点.
public abstract class FooRepositoryBase
{
public abstract Foo GetFoo(int ID);
}
public class SQLFooRepository : FooRepositoryBase
{
// Call DB and get a foo
public override Foo GetFoo(int ID); …Run Code Online (Sandbox Code Playgroud) 对于我的新宠物项目,我有一个设计问题,已经确定了,但我也想要其他一些意见.
我有两个类(简化):
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在抽象基类中实现?
我正在审查我编写的一些代码的一位新合作者告诉我,她不习惯看到直接在Java代码中使用的接口,例如:
public interface GeneralFoo { ... }
public class SpecificFoo implements GeneralFoo { ... }
public class UsesFoo {
GeneralFoo foo = new SpecificFoo();
}
Run Code Online (Sandbox Code Playgroud)
相反,期待看到
public interface GeneralFoo { ... }
public abstract class AbstractFoo implements GeneralFoo { ... }
public class SpecificFoo extends AbstractFoo { ... }
public class UsesFoo {
AbstractFoo foo = new SpecificFoo();
}
Run Code Online (Sandbox Code Playgroud)
我可以看到这个模式何时有意义,如果所有SpecificFoos通过AbstractFoo共享功能,但如果各种Foos有完全不同的内部实现(或者我们不关心特定的Foo如何做Bar,只要它这样做),直接在代码中使用接口有什么害处吗?我在某种程度上意识到这可能是一个番茄/西红柿的东西,但我很好奇第二种风格的优势,或者第一种风格的缺点,我不知道.
我正在喝coolade并喜欢它 - 接口,IoC,DI,TDD等等.运作得很好.但我发现我必须努力使一切都成为界面!我有一个工厂,这是一个接口.它的方法返回可能是接口的对象(可能使测试更容易).这些对象是他们所需服务的DI接口.我发现保持接口与实现同步是为了增加工作 - 向类添加方法意味着将它添加到类+接口,模拟等.
我是否过早地将接口分解出来?有什么最好的做法可以知道什么时候应该返回一个接口而不是一个对象?
c# ×5
interface ×5
java ×3
abstract ×2
inheritance ×2
oop ×2
architecture ×1
class ×1
classloader ×1
coding-style ×1
singleton ×1
tdd ×1
theory ×1
variables ×1