以抽象类作为参数的方法
我有一个抽象类 A,我在其中派生了类 B 和 C。 类 A 提供了一个抽象方法 DoJOB(),该方法由两个派生类实现。
有一个类X,里面有方法,需要调用DoJOB()。 类 X 不能包含任何类似 B.DoJOB() 或 C.DoJOB() 的代码。
示例:
public class X
{
private A foo;
public X(A concrete)
{
foo = concrete;
}
public FunnyMethod()
{
foo.DoJOB();
}
}
在实例化类 XI 时,想要决定必须使用哪个派生类(B 或 C)。 我考虑过使用 X 的构造函数传递 B 或 C 的实例。
X kewl = new X(new C());
kewl.FunnyMethod(); //calls C.DoJOB()
kewl = new X(new B());
kewl.FunnyMethod(); // calls B.DoJOB()
我的测试表明,声明带有参数 A 的方法不起作用。我错过了什么吗? 我怎样才能正确实施这个?
(A是抽象的,它不能被实例化)
编辑: 抱歉,我忘记了某件事。
类 A 是通用抽象单例:
abstract public class A<T> where T : A<T>
{
....
}
public sealed class B : A<B>
{
.....
}
public sealed class C : A<C>
{
.....
}
在标题行“通用单例作为抽象类的解决方案”下
I have an abstract class A, where I have derived the classes B and C.
Class A provides an abstract method DoJOB(), which is implemented by both derived classes.
There is a class X which has methods inside, which need to call DoJOB().
The class X may not contain any code like B.DoJOB() or C.DoJOB().
Example:
public class X
{
private A foo;
public X(A concrete)
{
foo = concrete;
}
public FunnyMethod()
{
foo.DoJOB();
}
}
While instantiating class X I want to decide which derived class (B or C) must be used.
I thought about passing an instance of B or C using the constructor of X.
X kewl = new X(new C());
kewl.FunnyMethod(); //calls C.DoJOB()
kewl = new X(new B());
kewl.FunnyMethod(); // calls B.DoJOB()
My test showed that declaring a method with a parameter A is not working. Am I missing something?
How can I implement this correctly?
(A is abstract, it cannot be instantiated)
EDIT:
Sorry, I forgot sth.
class A is a generic abstract singleton:
abstract public class A<T> where T : A<T>
{
....
}
public sealed class B : A<B>
{
.....
}
public sealed class C : A<C>
{
.....
}
See the example:
http://www.c-sharpcorner.com/UploadFile/snorrebaard/GenericSingleton11172008110419AM/GenericSingleton.aspx
Under the head line "The solution with the Generic Singleton as an abstract class"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您一定在测试中犯了错误,代码工作正常:
输出:
C
乙
You must have made a mistake in the test, the code works fine:
Outputs :
C
B
对于您的编辑:
For your edit:
对我有用。 我得到了预期的结果
当我运行它时,
。将其粘贴到您的 Visual Studio 中并使用它
干杯!
Works for me. I get the expected
when I run it.
Paste this in your Visual Studio and smoke it
Cheers!
我不确定我是否理解这个问题,这是我的实现并且它有效:
namespace CSharpConsole {
}
I'm not sure I understand the question, here is my implementation and it works:
namespace CSharpConsole {
}