我正在喝coolade并喜欢它 - 接口,IoC,DI,TDD等等.运作得很好.但我发现我必须努力使一切都成为界面!我有一个工厂,这是一个接口.它的方法返回可能是接口的对象(可能使测试更容易).这些对象是他们所需服务的DI接口.我发现保持接口与实现同步是为了增加工作 - 向类添加方法意味着将它添加到类+接口,模拟等.
我是否过早地将接口分解出来?有什么最好的做法可以知道什么时候应该返回一个接口而不是一个对象?
大家好,
我只是在思考抽象类和接口,我知道它们在技术上是如何工作的,但我不了解抽象类和接口的实际用途.我的意思是,当我们知道无法创建它的对象时,为什么我们应该使用抽象类,我们不得不扩展这个类来使用它,所以为什么我们不把所有东西都放在派生类中.
接口也是如此,我们必须实现接口,所以为什么我们不把接口中定义的所有方法都放在我们实现接口的类中.
有人可以用一些例子清楚我的怀疑吗?
我有一段时间是PHP程序员.两天前,我去了一个面试,他们给了我一个在ASP.NET(C#)做的分配.我真的想摆脱php领域的势力,学习一种可以挑战我的体面语言.所以,我有一个问题
是否必须在运行时实例化所有实例?在PHP中,我可以做这样的事情......
class SomeObject {}
$objString = "SomeObject";
$objInstance = new $objString();
Run Code Online (Sandbox Code Playgroud)
我不能在C#中做到这一点,可能因为它是一种编译语言.在C#中,我是否必须创建一个将实例化对象的Factory模式.这也意味着如果我必须在该工厂中实例化10个对象,那么将会有10个if丑陋的陈述.
我用它的Activator::createInstance()方法找到了Activator对象,但是我无法让它工作.还有反思,但这两者(正如我所知)都会对性能产生影响.
那么,有没有办法动态创建对象,或者可能是在C#中,我可以立即创建我的程序将使用的所有对象,这真的很诱人?
编辑
好的,所以让我说我有5个对象用于5个不同的场合.我运行程序,程序评估它需要其中一个对象并实例化它.其他四个从未实例化.我关闭了程序.
第二次,我使用不同的参数运行程序,并创建了这5个对象中的2个,其他三个永远不会出现.
这在PHP中很容易.让我们把Activator和其他工具放在一边,在C#世界中创建所有5个对象是不错的做法,当我知道可能只使用其中一个时?
我正在处理Kattis 问题,在这里我应该以前缀表示法接受输入,将其简化并以前缀表示法返回它。这些是输入和输出的示例:
Sample Input 1 Sample Output 1
+ 3 4 Case 1: 7
- x x Case 2: - x x
* - 6 + x -6 - - 9 6 * 0 c Case 3: * - 6 + x -6 - 3 * 0 c
Run Code Online (Sandbox Code Playgroud)
我已经编写了这段代码,并且如果使用这种输入数据运行它,我将获得与上述完全相同的输出。但是,我从Kattis那里得到了错误的答案。
我在这里做错了什么?由于没有任何调试提示,这令人沮丧。
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const operators = ['+', '-', '*', '/'];
const operatorsFunctions = {
'+': (a, b) => a …Run Code Online (Sandbox Code Playgroud) 可能重复:
接口与基类
我不理解抽象类和接口之间的区别.我什么时候需要使用哪种类型的艺术品?
假设我们要定义一个允许基本算术的类,称为"可添加".可以添加可添加的东西.
abstract class Addable
{
public abstract Addable Add(Addable X, Addable Y)
}
Run Code Online (Sandbox Code Playgroud)
实现Addable的正确方法是什么?以下不起作用,它给出:
Number没有实现继承的抽象成员Addable.Add(Addable,Addable).
class Number : Addable
{
public int Value;
public Number(int Val)
{
Value = Val;
}
public Number Add(Number X, Number Y)
{
return new Number(X.Value + Y.Value);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为问题在于Add将(Number,Number)作为其参数不够通用,但我不知道如何继续.
编辑:有些人要求知道这是用来做什么,让我详细说明.我正在使用一种依赖于获取最多几个对象的算法.根据用例,这些对象是数字或分布.为了保持上面的例子,我将假装我需要添加这些数字或分布.所以我希望代码看起来像:
Addable LongAlgorithm(Addable X, Other parameters)
{
... // Lots of code that may contain X
Z = Add(X,Y)
... // Code Using Z.
return Answer // Answer is of the same type as …Run Code Online (Sandbox Code Playgroud) 首先,很难为我的问题找到合适的标题......对不起提前做好准备.
我正面临着C#.NET的问题.我将尝试用一个临时的例子来简化它.
我有三个班:
book movie_dvd game_dvd
它们中的每一个都具有相同的基本属性,例如:id和name.然而,我们可以假设它们具有其他不同的属性和不同的方法来成为同一个类.他们当然可以成为父母班级的孩子,以使其更好.
然后我创建每个类的列表来定义我的书籍,电影和游戏的集合.它们的id属性当然与List的键匹配,当我在List中插入每个项目时,我给它们一个合适的名字(它们的标题).
我有一个带有3个按钮的主winForm:"Show Books Collection","Show Movies Collection"和"Show Games Collection".用户可以单击其中一个,然后出现另一个窗口并在ListBox(或其他)中显示传递的集合.
现在这是我的问题.
现在我正在创建三个独立的(但几乎相同的)WinForms来显示每个集合(书籍,电影,游戏)的内容,我认为这些内容非常过分.我真正想做的是创建一个窗口来显示任何这些集合的内容.问题是,如果我在新winForm的参数内传递一个book对象/类,另一方面它应该是一个book对象.
如何在不重复WinForm代码的情况下使用单个Winform显示每个不同对象的标题?
一个简单的问题.
我知道c#.net不支持多重继承.但您仍然可以通过实现多个接口来实现该功能.现在我的问题是,只要它们是抽象的,子类可以继承两个或更多类吗?
我知道在这个网站上可能会多次询问这个问题.我已经阅读了其他帖子并阅读了一些关于我们为什么必须使用接口的书籍.所有这些帖子和书籍都说,接口就像类,但它们只能包含函数,所有实现它们的类也应该实现它们的方法.所以我基本上知道它们是什么但是我不明白我为什么要编写一个接口,当我可以创建一个超类并将我的其他类扩展到那个超类而不是一次又一次地重写继承的函数.
如果有人向我解释,我真的很感激.
c# ×8
interface ×2
oop ×2
.net ×1
class ×1
inheritance ×1
javascript ×1
kattis ×1
tdd ×1
winforms ×1