Java对象,继承和接口(Java objects, inheritance and interface)
在Java中,对象可以有几个不同的类?
如果是的话,继承和接口应该如何影响它呢?
In Java, Can an object have several different classes ?
If yes , how should Inheritance and Interface influence to it?
原文:https://stackoverflow.com/questions/5373477
最满意答案
我认为你真正需要的是工厂。 工厂是一个知道,如果有一些信息可以处理,如何创建必要的适当类型的对象。 在您的情况下,您将创建一个解析器接口,然后分离实现各种解析器的类。 最后,创建一个解析器工厂,它具有一定的能力来告诉创建哪种解析器,创建并返回所需的类型。 这就是你的逻辑。 工厂提供了一种本地化所创建项目的创建逻辑的方法。
public interface IParser<T> { T Parse<T>( string item ); } public class KeyValueParser : IParser<KeyValue> { KeyValuePair Parse<KeyValue>( string item ); } ... public class ParserFactory { public IParser<T> CreateParser<T>() { var type = typeof(T); if (type == typeof(KeyValuePair)) { return new KeyValueParser(); } ... throw new InvalidOperationException( "No matching parser type." ); } }
其他一些人建议使用插件模型,如果合适,可以调整工厂以读取插件配置,加载适当的插件,并根据需要创建实例类型。 在这种情况下,将工厂视为“经理”可能更合适,因为它不仅仅是创建实例。
I think what you're really needing is a Factory. A Factory is a class that knows, given some information to work on, how to create objects of the proper type necessary. In your case, You'd create a parser interface, then separate classes implementing various parsers. Finally, create a parser factory that, given some ability to tell which kind of parser to create, creates and returns the kind needed. This is where your logic would go. The Factory provides a way to localize the creational logic for the items being created.
public interface IParser<T> { T Parse<T>( string item ); } public class KeyValueParser : IParser<KeyValue> { KeyValuePair Parse<KeyValue>( string item ); } ... public class ParserFactory { public IParser<T> CreateParser<T>() { var type = typeof(T); if (type == typeof(KeyValuePair)) { return new KeyValueParser(); } ... throw new InvalidOperationException( "No matching parser type." ); } }
Some others have suggested a plugin model and, if appropriate, the factory can be adapted to read a plugin configuration, load the appropriate plugins, and create the instance types as needed. In that case it might be more appropriate to think of the factory as a "manager" since it does more than simply create instances.
相关问答
更多-
C#依赖注入(C# Dependency Injection)[2023-07-15]
我认为你真正需要的是工厂。 工厂是一个知道,如果有一些信息可以处理,如何创建必要的适当类型的对象。 在您的情况下,您将创建一个解析器接口,然后分离实现各种解析器的类。 最后,创建一个解析器工厂,它具有一定的能力来告诉创建哪种解析器,创建并返回所需的类型。 这就是你的逻辑。 工厂提供了一种本地化所创建项目的创建逻辑的方法。 public interface IParser{ T Parse ( string item ); } public class KeyValueParser : ... -
1)是的,两者都有效 3)是的,属性和方法 2)一个更长的故事。 简而言之,如果您有POCO类并且您100%确定您永远不会针对不允许您使用POCO的框架进行编码(例如,它坚持继承从特定于框架的基类继承的类),你可以选择第一个选项(类)。 但它并不总是有效。 例如,为Linq2SQL编译存储库以及为Entity Framework Code First编写其他存储库,您不能使用同一组类。 第二种(接口)方法是唯一的选择。 我们已成功地在多个企业应用程序中使用它而没有任何问题。 一个建议 - 如果你使用接口方法 ...
-
何时使用依赖注入(When to use Dependency Injection)[2022-08-31]
两个单词, 单元测试 。 DI最令人信服的原因之一是允许更轻松的单元测试,而无需打数据库,并担心设置“测试”数据。 Two words, unit testing. One of the most compelling reasons for DI is to allow easier unit testing without having to hit a database and worry about setting up 'test' data. -
我找到了一个干净的(在我看来)我的问题的解决方案。 所以现在我有一个相当简单的方法来处理相关类的简单操作。 我用一些NInject绑定替换了DALContractFactory。 我有一个为我的控制器定义的自定义路由,需要在我的控制器上的OnActionExecuting中读取的“类型”。 对于模型,我有一个工厂定义和一个自定义映射器(我没有在这里发布它们,因为它们与问题无关)。 如果有人感兴趣,我可以用这种方法发布样本sln。 所以现在我有类似的东西: DAL public interface IDALC ...
-
我假设您希望逻辑像这个伪代码一样工作: IDelimitedFileEngine engine= null; // because you're programming to interfaces, right? switch(className) { case "Customer": engine = new DelimitedFileEngine
(); break; case "Employee": engine = new Delim ... -
不确定Munq,但Autofac允许你传递Func ,所以你可以完全跳过所有工厂: public class Foo { public Foo(Func
barFactory) { } } 检查Munq是否允许这样的行为。 否则 - 是的,你将不得不诉诸手写工厂来提供另一层次的间接。 I've added the Munq solution to this. First the factory which includes the IDependencyResolver ... -
如果你不介意你可以使用哪个IoC容器,我会推荐Ninject。 您需要通过Nuget安装下一个包: Ninject Web Api 2的Ninject集成 用于WebApi 2的Ninject Web Host Ninject Web Common Ninject Web通用Web主机 然后在Ninject配置文件NinjectWebCommon.cs中,在RegisterServices()方法的末尾添加以下代码: kernel.Bind
().To (); 现在只需将IUser作 ... -
C#依赖注入问题(C# Dependency Injection problem)[2022-07-15]
它必须是 public class MyClasswhere E : IEntity, class { IMyInterface businessLogic; public setBusinessLogic(IMyInterface myObject) { businessLogic = myObject; } } 要么 public class MyClass { IMyInterface businessLog ... -
似乎您要求按惯例进行配置 。 这意味着您可以识别应该共享公共配置的组件组,然后在阅读更多相关信息后在单个语句中指定该组态 实际上,这意味着您将所有具有选定功能“交付”的库部署到项目中的“特殊”位置,并从“特殊”接口继承所有实现。 最后,让DI容器找到它们并为你配置所有。 定义公约 这是一个如何使用Ninject.Extensions.Conventions实现此目的的简单示例。 注意评论 // 1 define "delivery" interface interface IShippingCompanyS ...
-
您必须做两件事:1)在Unity容器中注册两个具有特定名称的映射。 像这样修改你的xml配置:
相关文章
更多- Guava Objects类详解
- Java 继承
- Java 接口
- java接口问题
- 利用XUL(XML User-interface Language)是否能提高图形界面的开发效率?
- 关于ibatis3.0源码的疑问"@interface"
- Object Oriented Programming
- redis整合spring示例二—java操作redis(存对象及List)
- JAVA设计模式学习2——面向对象设计原则
- JAVA开源项目[转]
最新问答
更多- 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
- 如何通过引用返回对象?(How is returning an object by reference possible?)
- 矩阵如何存储在内存中?(How are matrices stored in memory?)
- 每个请求的Java新会话?(Java New Session For Each Request?)
- css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
- 无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
- xcode语法颜色编码解释?(xcode syntax color coding explained?)
- 在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
- 从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
- 从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
- 西安哪有PLC可控制编程的培训
- 在Entity Framework中选择基类(Select base class in Entity Framework)
- 在Android中出现错误“数据集和渲染器应该不为null,并且应该具有相同数量的系列”(Error “Dataset and renderer should be not null and should have the same number of series” in Android)
- 电脑二级VF有什么用
- Datamapper Ruby如何添加Hook方法(Datamapper Ruby How to add Hook Method)
- 金华英语角.
- 手机软件如何制作
- 用于Android webview中图像保存的上下文菜单(Context Menu for Image Saving in an Android webview)
- 注意:未定义的偏移量:PHP(Notice: Undefined offset: PHP)
- 如何读R中的大数据集[复制](How to read large dataset in R [duplicate])
- Unity 5 Heighmap与地形宽度/地形长度的分辨率关系?(Unity 5 Heighmap Resolution relationship to terrain width / terrain length?)
- 如何通知PipedOutputStream线程写入最后一个字节的PipedInputStream线程?(How to notify PipedInputStream thread that PipedOutputStream thread has written last byte?)
- python的访问器方法有哪些
- DeviceNetworkInformation:哪个是哪个?(DeviceNetworkInformation: Which is which?)
- 在Ruby中对组合进行排序(Sorting a combination in Ruby)
- 网站开发的流程?
- 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
- 条带格式类型格式模式编号无法正常工作(Stripes format type format pattern number not working properly)
- 透明度错误IE11(Transparency bug IE11)
- linux的基本操作命令。。。