假设我们有2个类,Child,以及它继承的类,Parent.
class Parent
{
public static void MyFunction(){}
}
class Child : Parent
{
}
Run Code Online (Sandbox Code Playgroud)
是否有可能在父类中确定如何调用该方法?因为我们可以用两种方式来称呼它:
Parent.MyFunction();
Child.MyFunction();
Run Code Online (Sandbox Code Playgroud)
我目前的方法是尝试使用:
MethodInfo.GetCurrentMethod().ReflectedType; // and
MethodInfo.GetCurrentMethod().DeclaringType;
Run Code Online (Sandbox Code Playgroud)
但两者似乎都返回父类型.
如果你想知道什么,我正在努力完成(为什么我违反了父母不应该对孩子有任何了解的基本OOP规则),这就是它的缺点(如果你想要,请告诉我)长版):
我有一个Model结构,表示我们持久存储到数据库的一些数据.所有这些模型都从一个抽象的Parent继承.此父实现了一些事件,例如SaveEvent,DeleteEvent等.我们希望能够订阅特定于该类型的事件.所以,即使事件在父母身上,我也希望能够做到:
Child.SaveEvent += new EventHandler((sender, args) => {});
Run Code Online (Sandbox Code Playgroud)
我有一切就绪,事件实际上由事件处理程序字典支持,按类型进行哈希处理.我需要做的最后一件事就是在做Child.SaveEvent时正确检测Child类型.
我知道我可以在每个子类中实现事件(甚至通过使用抽象来强制它),但是将它全部保存在父类中会很好,这是实际触发事件的类(因为它实现了公共保存/删除/更改功能).
可能重复:
方法何时应该是静态的?
我正在尝试为管/地铁票机制作接口类.不是真的,而是计算机科学模块的课程.我不明白何时使用静态方法.我不太了解计算机科学,但主要方法似乎使用静态.
class UNInterfaceTest
{
public static final int NOTTING_HILL = 1;
public static final int HIGH_KEN = 2;
public static final int GLOUS = 3;
public static final int SOUTH_KEN = 4;
public static final int SLOANE = 5;
public static final int VICTORIA = 6;
public static final int ST_JAMES = 7;
public static final int WESTMINSTER = 8;
public static final int QUIT = 10;
private Input in = new Input();
private static void displayMenu()
{ …Run Code Online (Sandbox Code Playgroud) 我遇到了涉及静态方法的Cocoa Touch/iOS的奇怪行为.如果在任何类中实现静态方法'load',Cocoa Touch/iOS将在应用程序开始执行时自动调用该方法.即使你没有从主执行线程中引用那个类,它仍然会被调用,无论如何.
我已经设法在Xcode 3.2.5上的SDK 4.2和Xcode 4.0.1上的SDK 4.3上编译时以及从iPhone模拟器和iPhone设备上运行时复制行为.
这是复制的方法:
创建一个新类并根据需要为其命名.在接口中声明一个静态方法'load'(任何返回类型):
+ (void)load;
Run Code Online (Sandbox Code Playgroud)
然后实现它:
+ (void)load {
NSLog(@"What the?");
}
Run Code Online (Sandbox Code Playgroud)
编译(确保新类编译)并运行应用程序(在模拟器或设备上).应用程序启动时,切换到并监视GDB视图.你会看到"什么?" 虽然按逻辑没有其他代码引用类或方法,但在那里回显.
最重要的是,如果您在方法中使用任何自动释放代码,您将收到一个错误,表明该方法甚至在int main()方法之前被调用(存在的所有C应用程序的超级网关).
以下代码:
+ (void)load {
NSLog(@"Hello %@", [NSString stringWithString:@"World"]);
}
Run Code Online (Sandbox Code Playgroud)
会给你一些看起来像的东西:
2011-04-21 00:41:53.828 AppName[548:707] *** __NSAutoreleaseNoPool(): Object 0x8fe8c of class NSCFString autoreleased with no pool in place - just leaking
2011-04-21 00:41:53.838 AppName[548:707] Hello World
Run Code Online (Sandbox Code Playgroud)
所以问题是,有人知道为什么Cocoa Touch/iOS会调用这种方法吗?方法名称'load'有什么特别之处?最后但并非最不重要的是,这是一个功能还是一个错误?
p/s:我发现这种行为时,我实现的静态方法'load'实例化了许多自动释放的对象,我被__NSAutoreleaseNoPool()GDB中的多个警告消息困惑.
在标题中我想知道如何在python中的static方法中使用自我实例.
class A
{
static function get_name_derived_class()
{
//This function must return the name of the real class
//Is it possible without insert a methon in B class?
{
}
class B extends A
{
}
B::test()
Run Code Online (Sandbox Code Playgroud)
我希望在基类中有一个静态方法,它返回真实(派生)类的名称,而不插入特定的方法.可能吗?感谢名单
我有以下课程
import java.util.ArrayList;
import java.util.List;
public class TestStaticArrayList {
public static List<String> numberList = new ArrayList<String>();
public static List<String> getArrayValues(){
return numberList;
}
public static void populateArray() {
numberList.add("1");
numberList.add("2");
numberList.add("3");
}
}
Run Code Online (Sandbox Code Playgroud)
上面类中的静态ArrayList是从下面的类调用动态填充的.
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class TestStaticInvokationClass {
public static void main(String[] args) throws Exception {
Class staticKlass = Class
.forName("com.sathish.test.TestStaticArrayList");
staticKlass.getMethod("populateArray", null).invoke(null, null);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图访问下面的类中的静态ArrayList.但它总是为空.
public class StaticArrayListAccessTest {
public static void main(String[] args) throws Exception {
System.out.println(TestStaticArrayList.getArrayValues());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用
static …Run Code Online (Sandbox Code Playgroud) 如何调用static方法里面的non static方法c#?
采访者给了我一个场景:
class class1
{
public static void method1(){}
public void method2()
{
//call method1()
}
Run Code Online (Sandbox Code Playgroud)
我们怎么做呢
我正在使用c#中的asp.net Web应用程序.我有一个名为GetUser的公共类.在那个类中,我有一个名为GetCurrentUser的方法.方法如下:
public MobileUser GetCurrentUser(MDMDataContext dc, string userCode)
{
using (dc)
{
dc.ObjectTrackingEnabled = false;
var currentUser =
from MobileUser in dc.MobileUsers
where MobileUser.UserCode == usercode
select MobileUser;
MobileUser mu = new MobileUser();
mu = currentUser.Single();
return mu;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用GetCurrentUser实例方法时,如下所示:
using (MDMDataContext dc = new MDMDataContext())
{
GetUser.GetCurrentUser(dc, "ABCD");
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,"非静态字段,方法或属性的对象引用' .... GetUser.GetCurrentUser ....'
但是如果我将static关键字添加到函数中,则错误就会消失.有人可以为我揭开这个概念的神秘面纱吗?
在我的c#代码中,我有一个静态方法.这是代码示例:
public class RandomKey
{
public static string GetKey()
{
Random rng = new Random();
char[] chars = new char[8];
for (int i = 0; i < chars.Length; i++)
{
int v = rng.Next(10 + 26 + 26);
char c;
if (v < 10)
{
c = (char)('0' + v);
}
else if (v < 36)
{
c = (char)('a' - 10 + v);
}
else
{
c = (char)('A' - 36 + v);
}
chars[i] = c;
}
string …Run Code Online (Sandbox Code Playgroud) 所以我有一个静态类让我们说它叫做Worker,并且让我说它里面有一个名为Wait(float f)的方法,所有公共所以我可以在任何地方访问它,如下所示:
Worker.Wait(1000);
Run Code Online (Sandbox Code Playgroud)
现在我想知道有什么方法可以定义某种独特的特殊方法,所以我可以像这样做:
Wait(1000);
Run Code Online (Sandbox Code Playgroud)
(没有在课堂上我会使用它)?