标签: concrete

C#接口继承到抽象类

假设我有一个如下定义的接口:

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# oop abstract-class interface concrete

50
推荐指数
3
解决办法
2132
查看次数

查找Interface实例后面的具体类型

简而言之,我有一个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)

c# types interface concrete

44
推荐指数
3
解决办法
5万
查看次数

单元测试:接口编码?

目前我的项目由各种具体课程组成.现在,当我进入单元测试时,看起来我应该为每个类创建一个接口(有效地将项目中的类数量加倍)?我碰巧使用Google Mock作为模拟框架.请参阅接口上的Google Mock CookBook.虽然之前我可能刚刚类CarEngine,现在我将有抽象类(又称C++接口)CarEngine然后实现类CarImplementationEngineImpl或什么的.这将使我能够Car依赖它Engine.

我在研究这个问题时遇到了两条思路:

  1. 仅当您可能需要对给定抽象的多个实现和/或在公共API中使用时才使用接口,否则不要不必要地创建接口.

  2. 单元测试存根/模拟通常 "其他实现",因此,是的,您应该创建接口.

在单元测试时,我应该为项目中的每个类创建一个接口吗?(我倾向于创建易于测试的界面)

c++ unit-testing interface concrete googlemock

14
推荐指数
2
解决办法
3459
查看次数

c#Mocking具有Moq的具体类的接口成员

我有一个接口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)

c# interface class moq concrete

10
推荐指数
1
解决办法
5980
查看次数

在UML中,您是否必须显示抽象方法的具体实现?

我正在绘制一些UML,其中一个具体类继承自定义纯虚方法的抽象类.是否需要在具体类中显示此方法?它是从继承自抽象类隐含的.

uml abstract concrete

5
推荐指数
1
解决办法
3469
查看次数

强制特质实现方法

我有一个特征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,提供共同的界面.

我有一个实现方法fooI调用的方法bar(在未实现I,但其中所述).我想要实现的是所有扩展的traits都I 必须实现bar,因此这会抛出编译时错误,因为bar没有实现:

trait Z extends I
Run Code Online (Sandbox Code Playgroud)

这可能在Scala中吗?

PS:我知道Force Scala特性实现某种方法的答案,但我不想要那种明确的耦合.

scala traits abstract concrete

5
推荐指数
1
解决办法
880
查看次数

C#:返回在运行时确定具体类型的对象的方法?

我正在考虑设计一个方法,该方法将返回一个实现接口的对象,但在运行时才会知道其具体类型.比如假设:

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)

这是一个很好的设计吗?有代码味吗?有一个更好的方法吗?

我很好用返回接口的方法,如果客户端代码显然调用接口方法,那就没问题了.但我担心的是客户端代码转换为具体类型是否是好的设计.

c# interface concrete

5
推荐指数
2
解决办法
1073
查看次数

PHP:接口中的抽象方法

为什么我不能在接口中声明一个抽象方法?这是我的代码.谢谢.

<?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)

php oop interface abstract concrete

3
推荐指数
2
解决办法
5314
查看次数

haskell - 是-ddump-simpl是获得具体类型的最佳方法吗?

我以前编写过一个似乎有效的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的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不是:).

debugging haskell types ghc concrete

3
推荐指数
1
解决办法
357
查看次数

我可以教dynamic_cast&lt;&gt;()新技巧吗?

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)

c++ abstract-class dynamic-cast concrete

1
推荐指数
1
解决办法
453
查看次数