当前位置:编程学习 > C#/ASP.NET >>

【讨论】"妓女"到底被谁"上了"?


public class 妓女
{
    public static string 上()
    {
        /*在这发挥聪明才智,当子类调用返回是谁调用的 */              
    }
}
public class 嫖客A : 妓女


}
public class 嫖客B : 妓女
{

}
static void Main()
 {
    Console.WriteLine(嫖客A.上());
    Console.Read();
 }
--------------------编程问答--------------------


public class 妓女
{
    public static string 上()
    {
        System.Diagnostics.StackFrame frame = new System.Diagnostics.StackFrame(0);
        return frame.GetMethod().ReflectedType.Name;
    }
}
public class 嫖客A : 妓女


}
public class 嫖客B : 妓女
{

}
static void Main()
 {
    Console.WriteLine(嫖客A.上());
    Console.Read();
 }



public class 妓女
{
    public static string 上()
    {
        return System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name;    
    }
}
public class 嫖客A : 妓女


}
public class 嫖客B : 妓女
{

}
static void Main()
 {
    Console.WriteLine(嫖客A.上());
    Console.Read();
 }


=====================================================
上面对2种方法都不行,返回的都不是"妓女",讨论下怎么才能让"妓女"知道是谁"上"了它!!! --------------------编程问答-------------------- 嘿嘿....
--------------------编程问答-------------------- 开发这个业务了,呵呵。 --------------------编程问答-------------------- 搞错了,上是嫖客的事,和妓女什么关系?被上才是妓女的事。
另外就是:编译器会把继承类的静态调用编译成直接调用基类的。也就是 嫖客A.上 在IL中是 妓女A.上,搞不清楚的。 --------------------编程问答-------------------- 很YY --------------------编程问答-------------------- 关注!!
up!! --------------------编程问答-------------------- 嫖客怎么跟妓女是继承关系呢,

一个是主动,一个是被动,两个东西不一样,不能继承
--------------------编程问答-------------------- 不是我!

--------------
灌下水! --------------------编程问答--------------------
引用 7 楼 Fibona 的回复:
嫖客怎么跟妓女是继承关系呢,

一个是主动,一个是被动,两个东西不一样,不能继承

顶,楼主逻辑没搞清楚 --------------------编程问答-------------------- 不是我 --------------------编程问答-------------------- up --------------------编程问答-------------------- 这个类的继承关系本身就是不对的,因为嫖客A和嫖客B都不是妓女!没有is-a的关系 --------------------编程问答-------------------- 妓女怎么会是嫖客的基类呢?妓女的上方法就错了,妓女应该是被上方法 --------------------编程问答-------------------- 伙计可以呀  研究这个呀 
--------------------编程问答-------------------- ... --------------------编程问答-------------------- 留下脚印,晚上回去看看 --------------------编程问答-------------------- 顶。。。楼主的逻辑好像不是很清晰,嫖客的上,是继承与妓女的,但是他们不是同一个意义和方法。望再仔细考虑。。 --------------------编程问答-------------------- 呵呵 --------------------编程问答-------------------- lz想得到类似js中的caller的对象。 --------------------编程问答-------------------- 问题出在static上,~~ --------------------编程问答-------------------- 不符合业务逻辑. --------------------编程问答-------------------- 这东西不要碰得好 --------------------编程问答-------------------- 嫖客继承自妓女?
那嫖客不就成了妓女的儿子了? --------------------编程问答-------------------- 我就是这么个意思!...
就在父类里面知道是被哪个子类调用了...
都研究起业务逻辑了..... --------------------编程问答-------------------- 这个拿出来讨论 有意思
关注!!!!!!!!! --------------------编程问答-------------------- 想象力丰富。。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 嫖客继承不了妓女类吧 --------------------编程问答--------------------
引用 7 楼 Fibona 的回复:
嫖客怎么跟妓女是继承关系呢, 

一个是主动,一个是被动,两个东西不一样,不能继承 


妓女把嫖客A上了,:) --------------------编程问答-------------------- 大家别老纠缠在妓女与嫖客之间的逻辑关系,我要大家讨论的是在父类里面知道是被哪个子类调用了... 
--------------------编程问答-------------------- 那另发个贴吧。
进来的都是找妓女的。 --------------------编程问答--------------------      不知道楼主到底想干嘛?探讨业务吗?不像,引人关注而已。。。 --------------------编程问答-------------------- 我只想让大家讨论下,怎么才能使父类知道是哪个子类调用了父类的方法... --------------------编程问答-------------------- 为什么不用虚函数呢?
搂住你不要告诉这也是故意的哦?
--------------------编程问答-------------------- 有趣,顶! --------------------编程问答-------------------- 有才 --------------------编程问答--------------------
引用 30 楼 kangxinhua 的回复:
大家别老纠缠在妓女与嫖客之间的逻辑关系,我要大家讨论的是在父类里面知道是被哪个子类调用了... 



说晚了 --------------------编程问答--------------------
引用 34 楼 hongzao 的回复:
为什么不用虚函数呢? 
搂住你不要告诉这也是故意的哦? 

====================================
你把代码发出来啊!!!! --------------------编程问答-------------------- 无论谁上了上 ,他们不都一个结果吗 爽了一下 --------------------编程问答-------------------- 经典 --------------------编程问答-------------------- 要包包三奶 --------------------编程问答-------------------- son of bitch~~~呵呵~~~ --------------------编程问答--------------------

class Program
    {
        public class Hooker
        {
            public virtual string Visit()
            {
                return "Hooker";
            }
        }
        public class WhoremasterA : Hooker
        {
            public override string Visit()
            {
                return "WhoremasterA";
            }
        }
        public class WhoremasterB : Hooker
        {
            public override string Visit()
            {
                return "WhoremasterB";
            }
        }

        static void Main(string[] args)
        {
            Hooker hookerA = new WhoremasterA();
            Hooker hookerB = new WhoremasterB();
            Console.WriteLine(hookerA.Visit());
            Console.WriteLine(hookerB.Visit());
            Console.Read();
        }
    }
--------------------编程问答-------------------- 2地很...
这个不会被封吧 --------------------编程问答-------------------- 忽忽......
   顶下! --------------------编程问答-------------------- 标题有意思............ --------------------编程问答-------------------- 不要忘了this就是指代当前对象:

        public class 妓女
        {
            public string 上()
            {
                return this.GetType().Name;
            }
        }
        public class 嫖客A : 妓女
        {

        }
        public class 嫖客B : 妓女
        {

        }

        static void Main(string[] args)
        {
            嫖客A a = new 嫖客A();
            Console.WriteLine(a.上());
            嫖客B b = new 嫖客B();
            Console.WriteLine(b.上());
            Console.Read();
        }
/*
输出:
嫖客A
嫖客B

*/
--------------------编程问答-------------------- 谁都不能上,因为嫖客还没有实例化,呵呵 --------------------编程问答-------------------- 太有才了。哈哈 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 看看 --------------------编程问答--------------------
引用 43 楼 hongzao 的回复:
C# code
class Program
    {
        public class Hooker
        {
            public virtual string Visit()
            {
                return "Hooker";
            }
        }
        public class WhoremasterA : Hooker
        {
            public override string Visit()
            {
                return "WhoremasterA";
            }
        }
        public class Whoremas…


都翻译成英文了~! --------------------编程问答--------------------
引用 33 楼 kangxinhua 的回复:
我只想让大家讨论下,怎么才能使父类知道是哪个子类调用了父类的方法...


“子类调用了父类的方法”这本身就是个没有根据的假设。

不排除有个别的编译器实现时,它在子类对象中去实例化一个内部对象,然后把子类实例的所有从父类继承的方法操作都委派给这个内部的父类对象实例。但是,如果你认为所有OO语言都是这样实现的,就错了。例如不要用c++的某个编译器的实现方式去生搬硬套到c#的编译器实现机制。

最多,你只能看成子类和父类具有相同的接口协议。于是,如果你从OO原理出发,那么运行时根本没有办法去想当然地认为有一个父类对象同时还有一个子类对象,而实际上只有一个最具体化的对象它实现了父类的接口。也就是说,按照你的程序来说,如果实例化“一个叫做刘小庆的嫖客A”,那么它也就是“叫做刘小庆的妓女”,变量x所代表的嫖客A对象同时也就是一个妓女,而不是说分别有一个嫖客A对象另外又有一个妓女对象。如果把继承关系看作两个对象之间的关系,就好像把“儿子继承遗产”看作继承关系,你就误解了生活中的语言而曲解为集成,把本来顶多是组合的关系说成是继承的了。 --------------------编程问答-------------------- 继承是强大的为复杂关系解耦的技术,但是滥用继承是非常有害的,反而让关系变得自相矛盾和诡异。 --------------------编程问答--------------------


UP,! --------------------编程问答-------------------- 继承本身就是使面向对象更好理解和使用,楼主这样只会是我们逻辑貌似更不清楚.. --------------------编程问答-------------------- 还没有嫖客,怎么妓女就被上了? --------------------编程问答-------------------- up --------------------编程问答-------------------- 43楼好强大~~~~~ --------------------编程问答--------------------
引用 43 楼 hongzao 的回复:
C# code
class Program
    {
        public class Hooker
        {
            public virtual string Visit()
            {
                return "Hooker";
            }
        }
        public class WhoremasterA : Hooker
        {
            public override string Visit()
            {
                return "WhoremasterA";
            }
        }
        public class Whoremas…

===================================
你曲解了我的意思!!
我的意思是
在父类的方法里名知道是谁调用了这个方法
就是在"妓女"的 "上()"的方法里
上()
{
   //在这里知道是谁调用的问题
} --------------------编程问答--------------------
引用 30 楼 kangxinhua 的回复:
大家别老纠缠在妓女与嫖客之间的逻辑关系,我要大家讨论的是在父类里面知道是被哪个子类调用了... 

.... --------------------编程问答--------------------
引用 53 楼 sp1234 的回复:
引用 33 楼 kangxinhua 的回复:
我只想让大家讨论下,怎么才能使父类知道是哪个子类调用了父类的方法... 
 

“子类调用了父类的方法”这本身就是个没有根据的假设。 

不排除有个别的编译器实现时,它在子类对象中去实例化一个内部对象,然后把子类实例的所有从父类继承的方法操作都委派给这个内部的父类对象实例。但是,如果你认为所有OO语言都是这样实现的,就错了。例如不要用c++的某个编译器的实现方式去生搬硬套到c#的…

==================================================
早听说sp1234 的大名了,久仰久仰....
我知道示例化类的时候只有一个对象..我的意思是如果我有个"妓女"的父类,一个"嫖客"的子类(先别管他逻辑问题)!!
当嫖客调用妓女的方法的时候,妓女有理由知道,这个方法是谁发出来的!...
就像特性似的,
当我在写妓女类的时候,我有理由去定义谁能继承妓女.. --------------------编程问答--------------------
引用 10 楼 jiang_jiajia10 的回复:
不是我


也不是我 --------------------编程问答--------------------
引用 43 楼 hongzao 的回复:
C# code
class Program
    {
        public class Hooker
        {
            public virtual string Visit()
            {
                return "Hooker";
            }
        }
        public class WhoremasterA : Hooker
        {
            public override string Visit()
            {
                return "WhoremasterA";
            }
        }
        public class Whoremas…


很女子很弓虽大 --------------------编程问答-------------------- 晕倒 --------------------编程问答-------------------- 路过.
System.Reflection.GetType(this)或许能够帮你"上". --------------------编程问答--------------------
引用 31 楼 netvt 的回复:
那另发个贴吧。 
进来的都是找妓女的。

哈哈~~ --------------------编程问答-------------------- 错了.可以这样写:
System.Console.WriteLine(this.GetType().Name); --------------------编程问答-------------------- 嫖客继承妓女,楼主想象力太丰富了! --------------------编程问答-------------------- 不错,不错 --------------------编程问答--------------------
引用 47 楼 ojlovecd 的回复:
不要忘了this就是指代当前对象: 

C# code
        public class 妓女
        {
            public string 上()
            {
                return this.GetType().Name;
            }
        }
        public class 嫖客A : 妓女
        {

        }
        public class 嫖客B : 妓女
        {

        }

        static void Main(string[] args)
        {
            嫖客A a = new 嫖…


我要的是静态的哦... --------------------编程问答--------------------
引用 68 楼 huangpeng8612 的回复:
错了.可以这样写: 
System.Console.WriteLine(this.GetType().Name);


静态的啦..... --------------------编程问答-------------------- 开发这个业务了,呵呵。 --------------------编程问答-------------------- 看来静态的可能是不可能了!!
因为 object 也只有Equals 和ReferenceEquals 这2个静态的方法
而不把 GetType() 弄成静态的.. --------------------编程问答-------------------- 才知道,嫖客都是妓女生的... --------------------编程问答-------------------- 由这个关系看:嫖客是妓女的儿子 --------------------编程问答-------------------- 关系不明确阿  嫖客怎么能继承妓女阿...
再说了  一旦嫖客继承了妓女  嫖客其实也就是妓女了阿  其实就是包含关系  
你的这关系用继承不是太好理解吧   --------------------编程问答--------------------
引用 62 楼 kangxinhua 的回复:
引用 53 楼 sp1234 的回复:
引用 33 楼 kangxinhua 的回复: 
我只想让大家讨论下,怎么才能使父类知道是哪个子类调用了父类的方法... 


“子类调用了父类的方法”这本身就是个没有根据的假设。 

不排除有个别的编译器实现时,它在子类对象中去实例化一个内部对象,然后把子类实例的所有从父类继承的方法操作都委派给这个内部的父类对象实例。但是,如果你认为所有OO语言都是这样实现的,就错了。例如不要用c++的某个编译…

子类调用了父类的方法?... 
lz,还是曲解了sp1234的意思,相当于父亲有三个儿子,作为一个人,他们都有能力给自己一记耳光,也就是说它们都有“抽自己”的方法,但是,某个儿子
“抽自己”,你非认为它是父亲抽了自己或是父亲抽了儿子都是不对的 --------------------编程问答-------------------- 静态方法不需要类的实例化,直接类名.静态方法名就可以了.... --------------------编程问答-------------------- 如果上方法是静态的估计实现不了吧..... --------------------编程问答-------------------- 楼主为什么不直接说下你的需求
用这种方法有什么好的。。。。 --------------------编程问答-------------------- 學習,大家都對妓女和嫖客很興趣,不錯,這說明中國的經濟沒有問題......,妓女的前途還是光明的。 --------------------编程问答-------------------- 很好很YD --------------------编程问答-------------------- 这个意思?

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender , EventArgs e )
        {
            B b = new B();
            C c = new C();

            MessageBox.Show( B.test( b ) + "_" + C.test( c ) );
        }
    }

    public class A
    {
        public static string test( object obj )
        {
            return obj.GetType().ToString();
        }
    }

    public class B : A
    {

    }

    public class C : A
    {

    }
}
--------------------编程问答--------------------
        public class 妓女
        {
            public string 上()
            {
                return this.GetType().Name;
            }
        }
       public class 嫖客B : 妓女
        {

        }
        static void Main(string[] args)
        {
            嫖客B (.)(.) = new 嫖客B();
            Console.WriteLine(b.上());
            Console.Read();
        }
  /*
  (.)(.)
  */
--------------------编程问答-------------------- 你的这个问题是不会有答案的,建议你看看设计模式的资料,父类永远不会知道有多少个子类,父类也不能调用子类的方法. --------------------编程问答-------------------- 冒泡帮顶接分

楼主的标题真吸引人,竟然在非技术区
好像还发过类似问题的帖子吧?所以花点时间感兴趣

稍改楼主的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{

    public class 妓女
    {
        public static string 上()
        {
            return "畜生";
            /*在这发挥聪明才智,当子类调用返回是谁调用的 */
        }
    }
    public class 嫖客A : 妓女
    {

    }
    public class 嫖客B : 妓女
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(嫖客A.上());
            Console.Read();
        }
    }
}

编译以后,看IL代码

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  call       string ConsoleApplication2.'妓女'::'上'()
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       int32 [mscorlib]System.Console::Read()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main

ConsoleApplication2是命名空间,直接调用了引用变量的类型妓女(即引用变量的静态类型、声明类型)来调用方法上()
所以似乎楼主的要求不能达到吧?没法判断是谁,所以还是不要作妓女这个行当吧! --------------------编程问答-------------------- up --------------------编程问答-------------------- 看到有说静态方法是静态绑定到子类,不是被继承 --------------------编程问答--------------------
引用 84 楼 journeydj 的回复:
这个意思? 

C# code
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender , EventArgs e )
        {
            B b = new B();
            C c = new C();

            MessageBox.Show( B.test( b ) + "_" + C.test( c ) );
        }
    }

    public class A
    {

=====================================
这个有意思!...... --------------------编程问答--------------------
引用 87 楼 wangfuchong 的回复:
冒泡帮顶接分 

楼主的标题真吸引人,竟然在非技术区 
好像还发过类似问题的帖子吧?所以花点时间感兴趣 

稍改楼主的代码: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 


    public class 妓女 
    { 
        public static string 上() 
        { 
            return "畜生"; 
            /*在这发挥聪明才智,…

=============================

不要骂人好不好啊!? --------------------编程问答-------------------- 怎么没人讨论了呢? --------------------编程问答--------------------
引用 90 楼 kangxinhua 的回复:
引用 84 楼 journeydj 的回复:
这个意思? 

C# code 
public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
        } 

        private void button1_Click( object sender , EventArgs e ) 
        { 
            B b = new B(); 
            C c = new C(); 

            MessageBox.Show( B.test( b ) + "_" + C.test( c ) ); 
     …


这个其实还是没有达到楼主想在方法里通过判断继承者的身份进行逻辑控制的要求吧,因为调用者在方法里传什么样的object进去是你没法控制的…… --------------------编程问答-------------------- 强帖,纯属路过 --------------------编程问答-------------------- 其实我只是想在写父类的时候,写个静态的方法!!知道谁静态的调用了这个方法!! --------------------编程问答-------------------- 或者是说静态的属性... --------------------编程问答-------------------- 很好很强大 --------------------编程问答-------------------- 唉,最近挺忙的!!都没时间来看下了 --------------------编程问答-------------------- --------------------编程问答-------------------- 这种烂帖也能盖100楼...

lz的逻辑思维能力与表达能力简直匪夷所思,小学生里也难找的人才啊...干这行太屈才了,建议你转行去娱乐业,很快就能成明星...
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,