假设我有一个如下定义的接口:
public interface IFunctionality
{
void Method();
}
Run Code Online (Sandbox Code Playgroud)
我为抽象类实现了这个接口,如下所示:
public abstract class AbstractFunctionality: IFunctionality
{
public void Method()
{
Console.WriteLine("Abstract stuff" + "\n");
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个具体的类,它继承自抽象类,如下所示:
public class ConcreteFunctionality: AbstractFunctionality
{
public void Method()
{
Console.WriteLine("Concrete stuff" + "\n");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有以下代码,
ConcreteFunctionality mostDerived = new ConcreteFunctionality();
AbstractFunctionality baseInst = mostDerived;
IFunctionality interfaceInst = mostDerived;
mostDerived.Method();
baseInst.Method();
interfaceInst.Method();
Run Code Online (Sandbox Code Playgroud)
执行这些东西后我得到的输出如下.
Concrete stuff
Abstract stuff
Abstract stuff
Run Code Online (Sandbox Code Playgroud)
但是我一直期望输出在所有三种情况下都是"混凝土东西",因为我在这里做的是分配ConcreteFunctionality
类型AbstractFunctionality
和变量的引用IFunctionality
.
内部发生了什么.请澄清一下.
简而言之,我有一个C#函数,它对作为Object实例传入的给定Type执行任务.传入类实例时,一切正常.但是,当对象被声明为接口时,我真的很想找到具体的类并对该类类型执行操作.
这是无处不在的坏例子(金属外壳不正确等等):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // …
Run Code Online (Sandbox Code Playgroud) 目前我的项目由各种具体课程组成.现在,当我进入单元测试时,看起来我应该为每个类创建一个接口(有效地将项目中的类数量加倍)?我碰巧使用Google Mock作为模拟框架.请参阅接口上的Google Mock CookBook.虽然之前我可能刚刚类Car
和Engine
,现在我将有抽象类(又称C++接口)Car
和Engine
然后实现类CarImplementation
和EngineImpl
或什么的.这将使我能够Car
依赖它Engine
.
我在研究这个问题时遇到了两条思路:
仅当您可能需要对给定抽象的多个实现和/或在公共API中使用时才使用接口,否则不要不必要地创建接口.
单元测试存根/模拟通常是 "其他实现",因此,是的,您应该创建接口.
在单元测试时,我应该为项目中的每个类创建一个接口吗?(我倾向于创建易于测试的界面)
我有一个接口ITransaction如下:
public interface ITransaction {
DateTime EntryTime { get; }
DateTime ExitTime { get; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个派生类PaymentTransaction如下:
public class PaymentTransaction : ITransaction {
public virtual DateTime LastPaymentTime
{
get { return DateTime.Now; }
}
#region ITransaction Members
public DateTime EntryTime
{
get { throw new NotImplementedException(); }
}
public DateTime ExitTime
{
get { throw new NotImplementedException(); }
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
我想模拟PaymentTransaction对象的所有三个属性.
我尝试了以下,但它不起作用:
var mockedPayTxn = new Mock<PaymentTransaction>();
mockedPayTxn.SetUp(pt => pt.LastPaymentTime).Returns(DateTime.Now); // This works
var mockedTxn = mockedPayTxn.As<ITransaction>();
mockedTxn.SetUp(t => …
Run Code Online (Sandbox Code Playgroud) 我正在绘制一些UML,其中一个具体类继承自定义纯虚方法的抽象类.是否需要在具体类中显示此方法?它是从继承自抽象类隐含的.
我有一个特征I
(中介),一个M
混合特性的类(混合器)和一个特征S
(特定).
class M extends Something with S {
def baz() = foo()
}
trait I {
def foo(): { ...; bar(); ... }
def bar()
}
trait S extends I {
def bar() = 42
}
Run Code Online (Sandbox Code Playgroud)
I
作为M
和之间的中间层S
,提供共同的界面.
我有一个实现方法foo
中I
调用的方法bar
(在未实现I
,但其中所述).我想要实现的是所有扩展的traits都I
必须实现bar
,因此这会抛出编译时错误,因为bar
没有实现:
trait Z extends I
Run Code Online (Sandbox Code Playgroud)
这可能在Scala中吗?
PS:我知道Force Scala特性实现某种方法的答案,但我不想要那种明确的耦合.
我正在考虑设计一个方法,该方法将返回一个实现接口的对象,但在运行时才会知道其具体类型.比如假设:
ICar
Ford implements ICar
Bmw implements ICar
Toyota implements ICar
public ICar GetCarByPerson(int personId)
Run Code Online (Sandbox Code Playgroud)
我们不知道在运行之前我们会得到什么车.
a)我想知道这个人有什么类型的汽车.
b)根据我们得到的具体车型,我们会调用不同的方法(因为有些方法只对类有意义).所以客户端代码会做类似的事情.
ICar car = GetCarByPerson(personId);
if ( car is Bmw )
{
((Bmw)car).BmwSpecificMethod();
}
else if (car is Toyota)
{
((Toyota)car).ToyotaSpecificMethod();
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的设计吗?有代码味吗?有一个更好的方法吗?
我很好用返回接口的方法,如果客户端代码显然调用接口方法,那就没问题了.但我担心的是客户端代码转换为具体类型是否是好的设计.
为什么我不能在接口中声明一个抽象方法?这是我的代码.谢谢.
<?php
interface Connection {
public abstract function connect();
public function getConnection();
}
abstract class ConnectionAbstract implements Connection() {
private $connection;
public abstract function connect();
public function getConnection() {
return $this->connection;
}
}
class MySQLConnection extends ConnectionAbstract {
public function connect() {
echo 'connecting ...';
}
}
$c = new MySQLConnection();
?>
Run Code Online (Sandbox Code Playgroud) 我以前编写过一个似乎有效的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的monad变换器堆栈].
run_astvn ::
LowerMonadT (StateT LowerSketchData Identity) ?
-> Seq SketchAST
run_astvn x = get_ast2 $ runIdentity $
runStateT (runStateT (runStateT x empty) empty)
(LowerSketchData Set.empty)
where get_ast2 = snd . fst
Run Code Online (Sandbox Code Playgroud)
我想得到具体的类型get_ast2
.我似乎能够-ddump-simpl
通过我的终端输出添加标志和grep,直到我找到,(清理了一点)
(((?, Seq SketchAST), Seq SketchAST), LowerSketchData) -> Seq SketchAST
Run Code Online (Sandbox Code Playgroud)
(对不起,这对其他人来说可能是胡说八道,但关键是它对我有用.)有更快/更方便的方法吗?如果不是很明显,在这种情况下我所说的"具体"是指上述类型是有用的; 知道的类型snd . fst
不是:).
C++ 中有没有一种方法可以构造您的类,以便给定一个指向您的类的指针,您可以指示dynamic_cast<>() 如何转换为您要包装其实现的另一个类?运算符强制转换可以解决问题吗?想象一下,我有一个抽象接口基类,并从中派生出一个creteA和一个concreteB,但concreteB将该接口包装到一个concreteA类型的对象。如果我收到从creteA转换为concreteA的请求,我希望它能够工作:
class Abstract {
public:
virtual void interface() = 0;
};
class concreteA : public Abstract {
public:
virtual void interface();
};
class concreteB : public Abstract {
public:
concreteB(concreteA &underlying)
: _underlying(&underlying) {
}
virtual void interface();
operator concreteA*() {
return _underlying;
}
private:
concreteA *_underlying;
};
void
myTest() {
concreteA myClassA;
concreteB myClassB(myClassA);
Abstract *abstract = &myClassB;
concreteA *underlying = dynamic_cast<concreteA *>(abstract);
}
Run Code Online (Sandbox Code Playgroud)